上一篇: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
的这条数据
然后再查询一下集合中的数据: