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() |