插入文档
插入一个文档
我们可以使用 insert() 或 save() 方法向集合中插入文档,语法如下:
示例:
db.testFile.insert({"content":"这是一个大文件","createTime":new Date(),"state":null})
注意点:
- 若 testFile 集合不存在,则会隐式创建
- 插入的数据没有指定 _id,会自动生成主键值
- 如果某字段没值,可以赋值为 null,或不写该字段
批量插入
我们可以一次插入多条文档,语法如下:
示例:
db.testFile.insertMany([
{"_id":"1","content":"我爱中国","createTime":new Date(),"state":"304"},
{"_id":"2","content":"我爱你","createTime":new Date(),"state":"401"},
{"_id":"3","content":"天下无双","createTime":new Date(),"state":"405"}
]);
由于我们在插入时显式指定了 _id,故主键也被设置为该值。如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
查询文档
查询文档的语法如下:
查询全部文档
db.testFile.find()
条件查询
如果想查询 state 数值为 304 的文档,那么就需要在 find 方法中添加参数了。
db.testFile.find({"state":"304"})
如果只需要返回符合条件的第一条数据,我们可以使用 findOne 来实现,其语法和 find 一样。
db.testFile.findOne({"state":"304"})
投影查询
如果要查询结果返回部分字段,则需要使用投影查询。例如,我们上面的查询只需要返回 _id 与 content 。
db.testFile.find({"state":"304"},{"content":1})
由于 _id 会默认显示,我们并不需要显式指定。
更新文档
更新文档的语法如下:
覆盖修改
现在我们有个需求,需要把 _id 为1的文档的 content 修改为 “我是菜鸡”,写出的语句如下:
db.testFile.update({"_id":"1"},{"content":"我是菜鸡"})
执行后,我们惊奇地发现,这条文档除了 _id 和 content 外,别的字段都消失了,这种更新又被称为覆盖修改。
局部修改
为解决上面的问题,我们需要使用修改器 $set,这次我们把 _id 为2的文档的 content 修改为 “这是一次测试”,写出的语句如下:
db.testFile.update({"_id":"2"},{$set:{"content":"这是一次测试"}})
测试一下,这样的写法会保留别的字段,只会完成局部修改,完美!
批量修改
将所有 state 值为 401 的文档中的 content 更新为 ”我的state是401“,写出的语句如下:
db.testFile.update({"state":"401"},{$set:{"content":"我的state是401"}})
但我们发现它只修改了符合条件的第一条数据。如果我们想修改所有符合条件的数据,需要对原来的更新语句做部分修改:
db.testFile.update({"state":"401"},{$set:{"content":"再次更新401"}},{multi:true})
删除文档
删除文档的语法为:
db.集合名称.remove(条件)
删除全部数据
db.集合名称.remove({})
删除部分数据
如果我们想删除 state 为 405 的文档,输入以下语句:
db.testFile.remove({"state":"405"})