1、mongodb update 用法2011-10-09 17:47ongodb 更新有两个命令:1).update()命令db.collection.update( criteria, objNew, upsert, multi )criteria : update 的查询条件,类似 sql update 查询内 where 后面的objNew : update 的对象和一些更新的操作符(如 $,$inc.)等,也可以理解为 sql update 查询内 set 后面的upsert : 这个参数的意思是,如果不存在 update 的记录,是否插入 objNew,true 为插入,默认是 fal
2、se,不插入。multi : mongodb 默认是 false,只更新找到的第一条记录,如果这个参数为 true,就把按条件查出来多条记录全部更新。例:db.test0.update( “count“ : $gt : 1 , $set : “test2“ : “OK“ ); 只更新了第一条记录db.test0.update( “count“ : $gt : 3 , $set : “test2“ : “OK“ ,false,true ); 全更新了db.test0.update( “count“ : $gt : 4 , $set : “test5“ : “OK“ ,true,false );
3、只加进去了第一条db.test0.update( “count“ : $gt : 5 , $set : “test5“ : “OK“ ,true,true ); 全加进去了db.test0.update( “count“ : $gt : 15 , $inc : “count“ : 1 ,false,true );全更新了db.test0.update( “count“ : $gt : 10 , $inc : “count“ : 1 ,false,false );只更新了第一条2).save()命令db.collection.save( x )x 就是要更新的对象,只能是单条记录。如 果在 co
4、llection 内已经存在一个和 x 对象相同的“_id“ 的记录。mongodb 就会把 x 对象替换 collection 内已经存在的记录,否则将 会插入 x 对象,如果 x 内没有_id,系统会自动生成一个再插入。相当于上面 update 语句的 upsert=true,multi=false 的情况。例:db.test0.save(count:40,test1:“OK“); #_id 系统会生成db.test0.save(_id:40,count:40,test1:“OK“); #如果 test0 内有_id 等于 40 的,会替换,否则插入。mongodb 的更新操作符:1) $
5、inc用法: $inc : field : value 意思对一个数字字段 field 增加 value,例: db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 16, “test1“ : “TESTTEST“, “test2“ : “OK“, “test3“ : “TESTTEST“, “test4“ : “OK“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $inc : “count“ : 1 ); db.test0.find( “_id“ : 15 );
6、“_id“ : “floatApprox“ : 15 , “count“ : 17, “test1“ : “TESTTEST“, “test2“ : “OK“, “test3“ : “TESTTEST“, “test4“ : “OK“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $inc : “count“ : 2 ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 19, “test1“ : “TESTTEST“, “test2“ : “OK“, “tes
7、t3“ : “TESTTEST“, “test4“ : “OK“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $inc : “count“ : -1 ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “TESTTEST“, “test2“ : “OK“, “test3“ : “TESTTEST“, “test4“ : “OK“, “test5“ : “OK“ 2) $set用法: $set : field : value 就是相
8、当于 sql 的 set field = value,全部数据类型都支持$set。例: db.test0.update( “_id“ : 15 , $set : “test1“ : “testv1“,“test2“ : “testv2“,“test3“ : “testv3“,“test4“ : “testv4“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “testv1“, “test2“ : “testv2“, “test3“ : “testv3“, “test4“
9、: “testv4“, “test5“ : “OK“ 3) $unset用法: $unset : field : 1 顾名思义,就是删除字段了。例: db.test0.update( “_id“ : 15 , $unset : “test1“:1 ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test2“ : “testv2“, “test3“ : “testv3“, “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 1
10、5 , $unset : “test2“: 0 ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test3“ : “testv3“, “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $unset : “test3“:asdfasf );Fri May 14 16:17:38 JS Error: ReferenceError: asdfasf is not defined (shell):0 db.test0.u
11、pdate( “_id“ : 15 , $unset : “test3“:“test“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test4“ : “testv4“, “test5“ : “OK“ 没看出 field : 1 里面的 1 是干什么用的,反正只要有东西就行。4) $push用法: $push : field : value 把 value 追加到 field 里面去,field 一定要是数组类型才行,如果 field 不存在,会新增一个数组类型加进去。例: db.test
12、0.update( “_id“ : 15 , $set : “test1“ : “aaa“,“bbb“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “aaa“, “bbb“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $push : “test1“: “ccc“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 ,
13、 “count“ : 18, “test1“ : “aaa“, “bbb“, “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $push : “test2“: “ccc“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “aaa“, “bbb“, “ccc“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.te
14、st0.update( “_id“ : 15 , $push : “test1“: “ddd“,“eee“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “aaa“, “bbb“, “ccc“, “ddd“, “eee“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ 5) $pushAll用法: $pushAll : field : value_array 同$push,只是一次可以追加多个值到一个数组字段内
15、。例: db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “aaa“, “bbb“, “ccc“, “ddd“, “eee“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $pushAll : “test1“: “fff“,“ggg“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “c
16、ount“ : 18, “test1“ : “aaa“, “bbb“, “ccc“, “ddd“, “eee“ , “fff“, “ggg“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ 6) $addToSet用法: $addToSet : field : value 增加一个值到数组内,而且只有当这个值不在数组内才增加。例: db.test0.update( “_id“ : 15 , $addToSet : “test1“: $each : “444“,“555“ ); db.test0.find( “_id“ : 15 );
17、 “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “aaa“,“bbb“,“ccc“,“ddd“,“eee“,“fff“,“ggg“,“111“,“222“,“444“,“555“, “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $addToSet : “test1“: $each : “444“,“555“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ :
18、 15 , “count“ : 18, “test1“ : “aaa“,“bbb“,“ccc“,“ddd“,“eee“,“fff“,“ggg“,“111“,“222“,“444“,“555“, “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $addToSet : “test1“: “444“,“555“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “a
19、aa“,“bbb“,“ccc“,“ddd“,“eee“,“fff“,“ggg“,“111“,“222“,“444“,“555“,“444“,“555“, “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $addToSet : “test1“: “444“,“555“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “aaa“,“bbb“,“ccc“,“ddd
20、“,“eee“,“fff“,“ggg“,“111“,“222“,“444“,“555“,“444“,“555“, “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ 7) $pop删除数组内的一个值用法:删除最后一个值: $pop : field : 1 删除第一个值: $pop : field : -1 注意,只能删除一个值,也就是说只能用 1 或-1,而不能用 2 或-2 来删除两条。mongodb 1.1 及以后的版本才可以用,例: db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“
21、: 15 , “count“ : 18, “test1“ : “bbb“,“ccc“,“ddd“,“eee“,“fff“,“ggg“,“111“,“222“,“444“, “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $pop : “test1“: -1 ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “ccc“,“ddd“,“eee“,“fff“,“gg
22、g“,“111“,“222“,“444“, “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ db.test0.update( “_id“ : 15 , $pop : “test1“: 1 ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “ccc“, “ddd“, “eee“ , “fff“, “ggg“, “111“, “222“ , “test2“ : “ccc“ , “test4“ : “testv4“,“tes
23、t5“ : “OK“ 8) $pull用法:$pull : field : value 从数组 field 内删除一个等于 value 值。例: db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “ccc“, “ddd“, “eee“ , “fff“, “ggg“, “111“, “222“ , “test2“ : “ccc“ , “test4“ : “testv4“,“test5“ : “OK“ db.test0.update( “_id“ : 15 , $pull : “tes
24、t1“: “ggg“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “ccc“, “ddd“, “eee“ , “fff“, “111“, “222“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“: “OK“ 9) $pullAll用法: $pullAll : field : value_array 同$pull,可以一次删除数组内的多个值。例: db.test0.find( “_id“ : 15 ); “_id“ : “
25、floatApprox“ : 15 , “count“ : 18, “test1“ : “ccc“, “ddd“, “eee“ , “fff“, “111“, “222“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“: “OK“ db.test0.update( “_id“ : 15 , $pullAll : “test1“: “ccc“ , “fff“ ); db.test0.find( “_id“ : 15 ); “_id“ : “floatApprox“ : 15 , “count“ : 18, “test1“ : “ddd“, “eee
26、“ , “111“, “222“ , “test2“ : “ccc“ , “test4“ : “testv4“, “test5“ : “OK“ 10) $ 操作符$是他自己的意思,代表按条件找出的数组里面某项他自己。呵呵,比较坳口。看一下官方的例子: t.find() “_id“ : ObjectId(“4b97e62bf1d8c7152c9ccb74“), “title“ : “ABC“, “comments“ : “by“ : “joe“, “votes“ : 3 , “by“ : “jane“, “votes“ : 7 t.update( comments.by:joe, $inc:co
27、mments.$.votes:1, false, true ) t.find() “_id“ : ObjectId(“4b97e62bf1d8c7152c9ccb74“), “title“ : “ABC“, “comments“ : “by“ : “joe“, “votes“ : 4 , “by“ : “jane“, “votes“ : 7 需要注意的是,$只会应用找到的第一条数组项,后面的就不管了。还是看例子: t.find(); “_id“ : ObjectId(“4b9e4a1fc583fa1c76198319“), “x“ : 1, 2, 3, 2 t.update(x: 2, $in
28、c: “x.$“: 1, false, true); t.find();还有注意的是$配合 $unset 使用的时候,会留下一个 null 的数组项,不过可以用$pull:x:null删除全部是 null 的数组项。例: t.insert(x: 1,2,3,4,3,2,3,4) t.find() “_id“ : ObjectId(“4bde2ad3755d00000000710e“), “x“ : 1, 2, 3, 4, 3, 2, 3, 4 t.update(x:3, $unset:“x.$“:1) t.find() “_id“ : ObjectId(“4bde2ad3755d00000000710e“), “x“ : 1, 2, null, 4, 3, 2, 3, 4 “_id“ : ObjectId(“4b9e4a1fc583fa1c76198319“), “x“ : 1, 3, 3, 2