MongoDB更新文档
转载请出自出处:http://eksliang.iteye.com/blog/2174104
MongoDB对文档的CURD,前面的博客简单介绍了,但是对文档更新篇幅比较大,所以这里单独拿出来。
语法结构如下:
db.collection.update( criteria, objNew, upsert, multi)
参数含义
参数 | 含义 |
criteria | update的查询条件,类似sql update查询内where后面的 |
objNew | update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的修改列 |
upsert | 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 |
multi | mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 |
一、文档替换
1、最简单的更新就是用一个新文档完全替换匹配文档。
参考实例
> user=db.user.findOne() { "_id" : ObjectId("54ae6fb5b94cf1b60f10570f"), "name" : "ickes", "pwd" : "xl1", "sal" : 1 } > user.sal=1200 --将该文档的sal改为1200 1200 > db.user.update({"pwd":"xl1"},user) --完全用新的文档替换集合中pwd=xl的文档 > db.user.findOne() --在次查看,替换成功 { "_id" : ObjectId("54ae6fb5b94cf1b60f10570f"), "name" : "ickes", "pwd" : "xl1", "sal" : 1200 }温馨提示:当查询条件匹配了多个文档,然后更新时由于第二个参数的存在就产生的重复“_id”的值。数据库就会抛出错误。
二、使用更新修改器
通常文档只会有一部分需要更新。可以使用“更新修改器”指定对文档中的某些字段进行更新。更新修改器是特殊的键,用来指定复杂的更新操作,比如修改、添加、删除键,还可以操作数组和内嵌文档。
1)$inc修改器
这个修改器是用来计数增加的(如果键不存在会在文档中增加键),例如有一个网站,当有人访问页面时,就计数加一,来做统计
参考实例
> db.iteye.findOne() { "_id" : ObjectId("54af318953b409e1c2efa8d8"), "title" : "iteye", "count" : 1 --该值本来为1 } > db.iteye.update({"title":"iteye"},{"$inc":{"count":1}}) --计数修改加1,如果是2,就会加2 > db.iteye.find() --再次查看 { "_id" : ObjectId("54af318953b409e1c2efa8d8"), "title" : "iteye", "count" : 2 } --修改成功
2)$set、$unset修改器
“$set”修改器用来指定一个字段的值。如果这个字段不存在,则创建他。$unset就是将文档中的某个键完全删除
参考实例
> db.user.find() { "_id" : ObjectId("54ae6fb5b94cf1b60f105710"), "name" : "xialiang" } > db.user.update({"name":"xialiang"},{"$set":{"name":"xl","title":"MongoDB"}}) --用set修改器修改第一条数据,name本来就存在,那么修改,而title在原文档中本来不存在,自动添加 > db.user.find() --查看修改结果,发现跟理论一样 { "_id" : ObjectId("54ae6fb5b94cf1b60f105710"), "name" : "xl", "title" : "MongoD B" }“$set”修改器修改嵌套文档 参考实例
> db.iteye.find() --查看iteye集合,里面有一个blog的内嵌文档 { "_id" : ObjectId("54af318953b409e1c2efa8d8"), "title" : "iteye", "count" : 4, "blog" : { "title" : "eksliang.iteye.com", "name" : "ickes" } } > db.iteye.update({"blog.name":"ickes"},{"$set":{"blog.name":"xl"}}) --用$set修改内嵌文档 > db.iteye.find() --查看当前修改,很明显修改成功 { "_id" : ObjectId("54af318953b409e1c2efa8d8"), "title" : "iteye", "count" : 4, "blog" : { "title" : "eksliang.iteye.com", "name" : "xl" } }“$unset”删除文档的键 参考实例
> db.user.find({"name":"xl"}) --查询name=xl的文档 { "_id" : ObjectId("54ae6fb5b94cf1b60f105710"), "name" : "xl", "title" : "MongoD B" } > db.user.update({"name":"xl"},{"$unset":{"title":1}}) --删除title这个键(这里删除键的值,官网说为任意数字,我测试时,任何值都是没有任何问题的) > db.user.find({"name":"xl"}) --再次查看,发现键删除成功 { "_id" : ObjectId("54ae6fb5b94cf1b60f105710"), "name" : "xl" }三、数组修改器