4

前言

上周在看项目的时候,看到数据库是使用mongodb,之前从来没有接触过就显得有点懵,这周就大概看了一下mongodb的基础用法

MongoDB介绍

Mongo是一个基于分布式文件存储的Nosql数据库。支持的数据结构非常松散,可以通过json格式来修改插入数据。

image.png

使用场景

1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。

2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。

3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将
订单所有的变更读取出来。

4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。

5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等。

应用特点:

  • 数据量大
  • 写入操作频繁(读写都很频繁)
  • 价值较低的数据,对事务性要求不高

什么是NoSQL

NoSQL是"Not Only SQL"的缩写,指的是非关系型数据库,是一种用于存储和检索大量数据的数据库管理系统,其数据存储模型不遵循传统的关系型数据库的表格模型。NoSQL数据库通常使用更灵活的数据模型,更适合处理半结构化和非结构化数据,

关系型数据库:采用表格模型,数据以行和列的形式存储,具有固定的表结构和数据类型。
image.png

NoSQL数据库:根据不同的类型可以有多种数据模型,包括文档型、键值对、列族、图等,通常更加灵活,能够存储半结构化和非结构化数据。而mongodb就是文档型数据库

image.png

文档数据库 MongoDB。

文档型数据库和关系型数据的区别:

image.png

关系数据库使用表格(表)来存储数据,其中每个表包含固定数量的列和无限数量的行。对于关系数据库,必须知道拥有哪些列。

文档型数据库使用类似于JSON或BSON格式的文档来存储数据。MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,一个文档认为是一个对象。字段数据类型是字符集。

Mongodb的常见操作

1、数据库操作

选择和创建数据库,如果数据库不在会自行创建

//use 数据库名称
use yunzhi

image.png

查看有权限查看的所有的数据库命令

show dbs
或
show databases

查看当前正在使用的数据库命令

db;

image.png

删除数据库,会删除当前使用的数据库

db.dropDatabase()

image.png

2、集合操作(也就是mysql的表操作)

集合创建(表创建)

db.createCollection("person")

查看当前库中的表:show tables命令

show collections
或
show tables

image.png

集合的删除

db.person.drop()

3、文档基本CRUD

文档的插入(如果当前集合不存在,会自行创建)

(1)单个文档插入

//一条数据插入
db.person.insertOne({name: '张三', age: 18})

(2)批量插入

//多条数据插入
db.person.insertMany([
    {name: '李四', age: 19},
    {name: '王五', age: 20},
])

db.person.insertMany([
    {name: '赵公明', age: 30, address: 'yunzhi'},
    {name: 'yunzhi', age: 21},
])

1)person集合如果不存在,则会隐式创建
4)插入的数据没有指定 _id ,会自动生成主键值(采用的是Object)
5)如果某字段没值,可以赋值为null,或不写该字段。

文档的基本查询

db.collection.find(<query>, [projection])

1)query,可选,使用查询运算符指定选择筛选器。
2)projection,可以指定查询字段返回

1)查询所有

db.comment.find()
或
db.comment.find({})

image.png

1)按照条件查询

db.person.find({name: 'yunzhi'})

image.png

如果你只需要返回符合条件的第一条数据,我们可以使用findOne命令来实现,语法和find一样。下面再插入一条name为yunzhi的数据。

db.person.insertOne({name: 'yunzhi', age:22})
db.person.find({name: 'yunzhi'});
db.person.findOne({name: 'yunzhi'});

image.png

image.png

(2)投影查询(Projection Query)

如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。
查询结果只显示 _id、name。默认 _id 会显示

db.person.find({name: 'yunzhi'}, {name: 1});

image.png

如果不显示_id。_id设置为0

db.person.find({name: 'yunzhi'}, {name: 1, _id: 0});

image.png

文档的更新

(1)局部修改

如果我们想修改name为张三的记录,年龄为30,输入以下语句:

db.person.updateOne(
   {name: '张三'},
   {$set: {age: NumberInt(30)}}
)

db.person.find({name: '张三'})

image.png

(2)批量的修改

db.person.update(
  {name: 'yunzhi'}, 
  {$set: {age: NumberInt(30)}}
)
db.person.find({name: 'yunzhi'});

从下图发现使用update进行修改,他只会默认修改一条符合条件的进行修改

image.png

如果想进行批量修改使用updateMany

db.person.updateMany(
  {name: 'yunzhi'}, 
  {$set: {age: NumberInt(30)}}
)
db.person.find({name: 'yunzhi'});

image.png

删除文档

db.collection.remove({})
或
db.collection.deleteOne()
db.collection.deleteMany()

指定条件进行删除, 会删除全部符合条件的数据

db.person.remove({name: "yunzhi"}) (不推荐,显示弃用)
或
db.person.deleteMany({name: "yunzhi"})

image.png

指定条件进行删除, 删除单挑数据

db.person.deleteOne({name: "yunzhi"})

文档的分页查询

(1)统计查询

统计查询count()方法

db.collection.count()

统计所有记录数:

db.collection.count()

image.png

统计符合条件的记录数:

db.person.count({name: "yunzhi"})

image.png

2)分页列表查询

返回指定条数的记录,使用find方法后调用limit来返回结果

db.person.find().limit(3)

image.png

skip方法同样接受一个数字参数作为跳过的记录条数。

db.person.find().skip(3)

image.png

分页查询,2个结合能实现分页查询效果

//第一页
db.person.find().skip(0).limit(2)
//第二页
db.person.find().skip(2).limit(2)
//第三页
db.person.find().skip(4).limit(2)

更多查询

1)比较操作符查询

db.person.find({ age : { $gt: 20 }}) 
// 大于: field > value

db.person.find({ age : { $lt: value }}) 
// 小于: field < value

db.person.find({ age : { $gte: value }}) 
// 大于等于: field >= value

db.person.find({ age : {$lte: value }}) 
// 小于等于: field <= value

db.person.find({ age : {$ne: value }})
// 不等于: field != value

包含查询使用$in操作符,查看name字段包含 yunzhi 或 张三 的文档

db.person.find({name:{$in:["yunzhi","张三"]}})

image.png

2)条件连接查询

要查询同时满足两个以上条件,使用$and操作符,查看name字段为yunzhi, age字段值为30

db.person.find({
  $and: [
    { age: { $eq: 30 } },
    { name: "yunzhi" }
  ]
});

image.png

要查询满足一个条件满足的数据,使用$or操作符,查看name字段为yunzhi, age字段值为30

db.person.find({
  $or: [
    { age: { $eq: 30 } },
    { name: "yunzhi" }
  ]
});

image.png

总结

总体下来,mongodb的操作还是相对简单,如果有接触过mysql数据库等相关的数据库,学习基础操作从mongodb官网看着相关的api很容易上手。

参考文章

https://docs.mongoing.com/
https://www.runoob.com/mongodb/mongodb-tutorial.html


kexb
474 声望15 粉丝