5.MongoDB 文档基本 CRUD
1.文档的插入
(1) 单个文档插入
语法:
1  | > db.[collection_name].insert([json_data])  | 
1  | > db.[collection_name].save([json_data])  | 
使用insert() 或 save() 方法向集合中插入文档
1  | > show databases  | 
1  | > db.my_comment.insert({"articleid":"100000", "content": "today", "userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null})  | 
提示:
- comment集合如果不存在,则会隐式创建
 - mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
 - 插入当前日期使用 new Date()
 - 插入的数据没有指定 _id ,会自动生成主键值
 - 如果某字段没值,可以赋值为null,或不写该字段。
 
注意:
- 文档中的键/值对是有序的。
 - 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
 - MongoDB区分类型和大小写。
 - MongoDB的文档不能有重复的键。
 - 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
 
文档键命名规范:
- 键不能含有
\0(空字符)。这个字符用来表示键的结尾。 .和$有特别的意义,只有在特定环境下才能使用。- 以下划线”_”开头的键是保留的(不是严格要求的)。
 
(2) 批量插入
语法:
1  | db.[collection_name].insertMany([{json_data}, {json_data}, ...])  | 
1  | > db.my_comment.insertMany([{"_id": "1","articleid": "100001","content": "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid": "1002","nickname": "相忘于江湖","createdatetime":new Date("2019-08-05T22: 08: 15.522Z"),"likenum":NumberInt(1000),"state": "1"},{"_id": "2","articleid": "100001","content": "我夏天空腹喝凉开水,冬天喝温开水","userid": "1005","nickname": "伊人憔悴","createdatetime":new Date("2019-08-05T23: 58: 51.485Z"),"likenum":NumberInt(888),"state": "1"},{"_id": "3","articleid": "100001","content": "我一直喝凉开水,冬天夏天都喝。","userid": "1004","nickname": "杰克船长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state": "1"}])  | 
提示:
- 插入时指定了 
_id,则主键就是该值。 - 如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
 - 因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理
1
2
3
4
5try {
db.[collection_name].insertMany([json_array]);
} catch(e) {
print(e);
} 
2.文档的基本查询
(1) 查询所有
语法:
1  | > db.[collection_name].find()  | 
1  | > db.my_comment.find()  | 
(2) 字段筛选条件
语法:
1  | > db.[collection_name].find({})  | 
1  | > db.my_comment.find({"articleid" : "100001"})  | 
1  | > db.my_comment.find({"articleid" : "100001", "userid" : "1005"})  | 
(3) 只返回符合条件的第一条数据
语法:
1  | > db.[collection_name].findOne({})  | 
1  | > db.my_comment.findOne({"articleid" : "100001"})  | 
(4) 投影查询(Projection Query)
如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)
语法:
1  | > db.[collection_name].find({[query_field]}, {[display_field]})  | 
默认 _id 会显示
1  | > db.my_comment.find({"articleid" : "100001"}, {articleid:1})  | 
1  | > db.my_comment.find({"articleid" : "100001"}, {articleid:1, _id:0})  | 
1  | > db.my_comment.find({"articleid" : "100001", "state": "1"}, {articleid:1, userid:1, state: 1, _id: 0})  | 
3.文档的更新
(1) 覆盖修改
语法:
1  | > db.[collection_name].update({[query_field]}, {[new_value]})  | 
1  | > db.my_comment.find()  | 
(2) 局部修改
语法:
1  | > db.[collection_name].update({[query_field]}, {$set: {[new_value]}})  | 
1  | > db.my_comment.find()  | 
(3) 批量修改
语法:
1  | > db.[collection_name].update({[query_field]}, {$set: {[new_value]}}, {multi: true})  | 
1  | > db.my_comment.find({"userid" : "1003"})  | 
不添加 {multi: true} 只会修改第一个记录
1  | > db.my_comment.update({"userid" : "1003"}, {$set: {"state" : "2"}})  | 
只有值不等的情况下才会更新,更新的记录数并不是查询匹配的记录数
1  | > db.my_comment.update({"userid" : "1003"}, {$set: {"state" : "2"}}, {multi: true})  | 
1  | > db.my_comment.update({"userid" : "1003"}, {$set: {"state" : "1"}}, {multi: true})  | 
(3) 列值增长修改
1  | > db.my_comment.find({"userid" : "1003"})  | 
1  | > db.my_comment.update({"userid" : "1003"}, {$inc: {"likenum":NumberInt(1)}}, {multi: true})  | 
1  | > db.my_comment.find({"userid" : "1003"})  | 
4.删除文档
语法:
1  | > db.[collection_name].remove({[delete_condition]})  | 
1  | > db.my_comment.find()  | 
1  | > db.my_comment.remove({"state" : null})  | 
1  | > db.my_comment.find()  | 
删除全部文档:
语法:
1  | > db.[collection_name].remove({})  | 
1  | > db.my_comment.remove({})  | 
1  | > db.my_comment.find()  |