
上一篇:MongoDB(4)—集合创建和删除
| 文档的增删改查 |
一、创建文档
1.插入单个文档数据:
使用下面语法可以向某个集合中插入单个的文档数据
db.集合名称.insert()
或者
db.集合名称.save()
栗子,我们需要在trade_db库的students集合中插入有一些数据:

文档插入数据之后返回结果如上图所示,则文档数据插入成功。
2.插入多个文档数据(批量插入):
db.集合名称.insertMany()
栗子:我们需要向students集合中批量插入下面得数据:
db.students.insertMany([
{
"name": "zhangsan",
"age": 18
},
{
"address": "beijing",
"phone": "18112341234"
}
])

上图中得结果表示批量数据插入成功。
3.插入文档数据时使用try catch
因为MongoDB如果使用事务会影响写入性能,所以一般我们的MongoDB不建议使用事务功能,但是在批量插入的时候,如果其中的某一条数据插入失败了怎么办?没有事务那就比较麻烦了,这里我们可以使用try catch语句块来解决:
try {
db.students.insertMany([
{
"name":"zhangsan",
"age":18,
"code":1
},
{
"name":"lisi",
"address":"beijing",
"phone":"18112341234",
"code":1
}
])
} catch (e) {
print(e);
}
首先我们将之前的集合students中所有数据删除掉,然后使用try catch的方式来批量插入数据,如果有异常将异常信息打印出来,然后再去做相应的调整。

数据插入成功。
二、查询文档
1.查询所有得文档数据
使用下面命令可以查看集合中得所有文档
db.集合名称.find()

2.按照条件查找数据
db.集合名称.find({json格式的条件参数}) //db.students.find({"name":"zhangsan"})

查询的结果就只有name参数为zhangsan的那条文档数据了。
3.获取所有查询出来的多个数据中的第一条
使用下面的命令可以只获取所有查询数据中的第一条,相当于limit(0,1)

4.投影查询
什么是投影查询?
投影查询就是只显式指定的字段而不是显式所有的字段。类似于mysql中的select *与select 字段名的区别。
使用下面的语法可以进行投影查询:
db.集合名称.find({查询条件},{显式的字段:1,显式的字段:1……})
栗子:在下面的数据中

我想要查询出来code为1,并且只显式name字段:
db.students.find({code:1},{name:1})
find方法里面的第一个参数是查询条件,第二个参数name:1表示只显式name字段

在上面的查询结果中,我们发现_id字段如果不做指定的话,默认是显式的,如果想要不显示_id字段,我们可以使用如下命令
db.students.find({code:1},{name:1,_id:0})

如果我们不仅想要显式name字段,还想要显式code字段,则在第二个参数的括号类进行指定
db.students.find({code:1},{name:1,_id:0,code:1})

总结:
第二个括号内字段对应的1或者0分别代表了显式此字段或者不显示此字段。
5.count查询
db.集合名称.count(查询条件)
5.1 查询集合中所有的文档数量

5.2 查询集合中指定条件的文档数量

6.分页查询
测试使用的数据:
db.students.insertMany([
{
"name": "zhangsan",
"age": 18,
"code": 1
},
{
"name": "lisi",
"address": "beijing",
"phone": "18112341234",
"code": 1
},
{
"name": "wangwu",
"address": "shanghai",
"grade": NumberInt(86),
"code": 1
},
{
"name": "zhaoliu",
"address": "sichuan",
"grade": NumberInt(91),
"code": 2
}
])
6.1 返回指定条数的数据(limit)
现在需要查询students集合中的code为1的所有数据中的前2条:

6.2 返回跳过指定条数之后剩下的数据(skip)
案例:db.students.find({code:1}).skip(2) //不要所有code为1的数据中的前2条

6.3 分页查询
案例:students集合中的4条数据:
第一页:展示前2条

第二页:展示第3条

第三页:展示第4条

7.排序查询
排序查询的语法:
db.集合名称.find({条件}).sort(排序字段:1或者-1) //1代表升序排序 -1代表降序排序
在下面的数据中:

我需要将students中的数据进行降序排序

总结:
当limit(),skip(),sort()三个特殊方法放在一起使用的时候,执行顺序依次是:sort(),skip(),limit(),并不是按照我们写这三个方法的顺序来执行的。
8.复杂查询
8.1 正则匹配查询
db.集合名称.find({字段:/正则表达式/})
8.2 比较查询
大于:db.集合名称.find({字段:{$gt:值}})
小于:db.集合名称.find({字段:{$lt:值}})
大于等于:db.集合名称.find({字段:{$gte:值}})
小于等于:db.集合名称.find({字段:{$lte:值}})
不要问等于应该怎么表示……
等于:db.集合名称.find({字段:值})
8.3 包含查询
MongoDB中,包含使用$in,不包含使用$nin
包含: db.集合名称.find({字段:{$in([值,值……])}])
不包含: db.集合名称.find({字段:{$nin(值,值,……)}])
8.4 条件查询
当我们需要查询一个同时满足2个以上的条件的数据,可以使用$and操作符,类似于mysql中的and
db.集合名称.find({$and:[{字段:值},{字段:值}……]})

三、修改文档
1.覆盖式的修改
修改语法:
db.集合名称.update({查询条件},{修改条件},upsert: multi: writeConcern:)
upsert:此参数可选。如果不存在update的记录,是否插入?true为插入,false为不插入。
mutli:此参数可选,MongoDB默认是false,只修改找到的所有数据中的第一条。指定为true表示修改找到的所有数据。
writeConcern:此参数可选,表示抛出的异常级别
| 等级 | 描述 |
|---|---|
| -1 | 忽略网络错误 |
| 0 | 不要求进行写入确认 |
| 1 | 要求进行写入确认 |
| 2 | 要求以写入到副本集的主服务器和一个备用服务器 |
| majority | 要求已写入到副本集中的大多数服务器中 |
在下面的数据中

我想把name为zhangsan的那条数据的code值修改为20
db.students.update({"name":"zhangsan"},{"code":NumberInt(20)})

在上面的命令中,code值为什么不直接写20而是要用NumberInt()函数进行转换一下?
因为MongoDB默认情况下将所有的数字定义为浮点数(double)类型,我们可以使用NumberInt()函数来指定数字为整数。
以上的修改方式是覆盖式的修改,可以查看一下此时集合中的此条数据:

此条数据中除了_id字段没有变化,剩下的字段均被code:20所覆盖。
2.局部更改
如果我们不想要覆盖式的修改而是只对个别字段值进行修改,则可以使用下面的语法:
db.集合名称.update({查询条件},{$set:{修改条件}})
栗子:我们想把name:lisi这条记录的code值修改为code:20,但是不改变该条数据的其他字段值。

此时我们再查看一下students集合的数据:

3.批量修改
在下面的数据中:

如果我想批量的将code:1的数据的name修改为wangwu。则可以使用下面的语法:
db.集合名称.update({查询条件},{$set:{修改条件}},false,true ))

栗子:
此时再查看一下students集合中的数据:

4.列值增长的修改
现在我想把age:18的这条数据的code值在原有的基础上加1
db.集合名称.update({查询条件},{$inc:{修改条件}})

此时查询下集合中的数据:

如果想要在原有的值上递减1,则直接将NumberInt(1)修改为NumberInt(-1)就OK了。
5.文档字段追加
db.集合名称.update({查询条件},{$set:{修改内容}},{upsert:true})
栗子:在下面数据中

想要在第一条数据中追加一个address字段

查询此时的students集合的数据:

字段追加成功。
四、删除文档
删除文档数据的语法:
db.集合名称.remove(查询条件)
1.全部删除(慎用)
db.集合名称.remove({})
2.按条件删除
db.集合名称.remove({})
栗子:我要删除students集合中age:18的这条数据

然后再查询一下集合中的数据:
