今天继续好久没学习的mongodb的简单学习,今天来看的是更新。先来看简单的用法:
use updatetest
>switched to db updatetest
首先插入一下:
db.things.insert( { name : "test1"} )
db.things.find({name : "test1"})
会找到:
{ "_id" : ObjectId("50f1778ea5ec290b7773303b"), "name" : "test1" }
更新的格式为:
db.collection.update( criteria, objNew, upsert, multi )
参数:
criteria - 查询须要更新的项;
objNew - 更新的对象或者 $ operators (例如 $inc) 这样的操做因子
upsert - 是不是 "upsert"; 也就是说若是记录不存在是否插入新的记录
multi - 是否全部知足criteria的在整个文档都更新
注意:在缺省状况下,update()只会更新第一个知足条件的项。若是须要修改因此的知足条件的
项的话,须要使用multi这个标志位。
db.things.update({name: "test1"}, {name: "test2"})
再find一下
db.things.find({name : "test2"})
会发现有test2了;
再来:
db.things.update({name : "hello"}, {name: "hello,abc"}, true);
注意参数true这里的用法,结果为,由于hello没有,因此只会插入
hello,abc了。
也能够写成:
db.things.update({name : "hello"}, {name: "hello,abc"}, { upsert: true });
注意:
一、update方法只更新一条记录
默认状况下update只更新符合查询条件的第一条找到的记录。若是想更新全部符合条件的记录,须要手动添加 multi 这个参数。
二、update方法的更新参数
像下面这个语句
updatetest.update( { _id: X }, {name: "Joe", age: 20 });
会把符合条件的原纪录按照{name: "Joe", age: 20 }完整替换,而不是简单的将name设为"Joe",age设为20.
若是只想更改这2个值,而不是替换完整对象,应该写
updatetest.update( { _id: X },{$set: {name: "Joe", age: 20 }});
$inc的用法,好比统计常常要用到了,如:
db.things.update({BlogPost: "How To Do Upserts"}, {$inc: {Hits: 1}}, { upsert: true });
db.things.find({BlogPost : "How To Do Upserts"})
>{ "_id" : ObjectId("50f17b4541c33bd2459aafed"), "BlogPost" : "How To Do Upserts", "Hits" : 1 }
再多运行两次:
db.things.update({BlogPost: "How To Do Upserts"}, {$inc: {Hits: 1}}, { upsert: true });
db.things.update({BlogPost: "How To Do Upserts"}, {$inc: {Hits: 1}}, { upsert: true });
>db.things.find({BlogPost : "How To Do Upserts"})
>{ "_id" : ObjectId("50f17b4541c33bd2459aafed"), "BlogPost" : "How To Do Upserts", "Hits" : 3 }
能够看到,hits变为3了。
multi的用法:
好比:
db.Indexing.insert( { name : "Denis", age : 10 } )
db.Indexing.insert( { name : "Denis", age : 20 } )
db.Indexing.insert( { name : "Denis", age : 30 } )
要将全部的denies的age都更新,必须加行multi:
db.Indexing.update({name: "Denis"}, {$set: {age: 42}},{ multi: true })