db.collection.update({查询器},{修改器})
文档存入数据库后,可以使用update来更新文档,update有两个参数,一个是查询器,一个是修改器。
还有第三个,第四个可选参数:第三个设为true,表示upsert,即如果不存在则进行插入。第四个设为true表示,批量操作
文档替换
文档替换是用一个文档替代匹配的文档,这种适用于模式结构发生了较大变化的时候。
例如将下面结构的文档
{ "name":"joe", "friends":32, "enemies":2 }变化成以下结构:
{ "username":"joe", "relationships":{ "friends":32, "enemies":2 } }可以使用update来替换文档:
>var joe = db.users.findOne({"name":"joe"}); >joe.relationships = {"friends":joe.friends,"enemies":joe.enemies}; { "friends":32, "enemies":2 } >joe.username = joe.name "joe" >delete joe.friends; true >delete joe.enemies; true >delete joe.name; true >db.users.update({"name":"joe"},joe)这里是将查询出来的文档,赋给js的一个对象,然后将js对象的属性进行替换,最后使用update进行整个文档的替换。
修改器
修改器名称 | 语法 | 案例 |
---|---|---|
$set | {$set:{field:value}} | {"$set":{"name":"coolcao"}} |
$set用来指定一个键值对,如果存在就进行修改,不存在就进行添加 | ||
$inc | {$inc:{field:value}} | {"$inc":{"count":1}} |
$inc只适用于数字类型,可以为指定的键对应的数字进行加减操作。 | ||
$unset | {$unset:{field:1}} | {"$unset":{"name":1}} |
$unset用于删除指定的键 | ||
$push | {$push:{field:value}} | {"$push":{"books":"js"}} |
如果指定的键是数组,追加新的数值如果指定的键不是数组,则终端当前操作(cannot apply $push/$pushAll modifier to non-array)如果不存在指定的键,则创建数组类型的键,进行追加 | ||
$pushAll | {$pushAll:{field:array}} | {"$pushAll":{books:["java","js"]}} |
用法和$push相似,添加数组到数组 | ||
$addToSet | {$addToSet:{field:value}} | {"$addToSet":{"books":"js"}} |
目标数组存在则此项不操作,不存在则添加进去。
和$push相似也是对数组进行操作,但是$push允许重复,$addToSet不允许重复 |
||
$pop | {$pop:{field:value}} | {"$pop":{"name":1}}{"$pop":{"name":-1}} |
从指定的数组删除一个值。1删除最后一个值,-1删除第一个值。 | ||
$pull | {$pull:{field:value}} | {"$pull":{"books":"js"}} |
删除一个被指定的数值 | ||
$pullAll | {$pullAll:{field:array}} | {"$pullAll":{"books":["js","java"]}} |
一次性删除多个值 |
upsert
upsert是一种特殊的更新,如果没有符合条件的更新,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了符合条件的文档,则正常更新。
db.collection.update({查询器},{修改器},true)
例如,存储学生信息的collection结构如下:
{ "_id" : ObjectId("532a545274d02410efb93691"), "name" : "赵小强", "sex" : "女", "score" : { "math" : 15, "english" : 15, "chinese" : 13 } }现在我们不知道里面有没有一个叫"大兵"的学生,我们想为名为“大兵”的学生更新喜欢的书籍books为["唐诗三百首","儿歌欢乐唱"]
>db.students.update({"name":"大兵"},{$pushAll:{"books":["唐诗三百首","儿歌欢乐唱"]}},true)这里我们将第三个参数设为true,如果找不到名为"大兵"的文档,则插入一个名为大兵的文档,添加books键,值为["唐诗三百首","儿歌欢乐唱"]
更新多个文档
db.collection.update({},{},,true)
如果不进行upsert,则第三个参数空着不填即可。
例如,我们将所有女生的书籍books中都添加一本“跟着三毛去流浪”,可以使用以下语句:
>db.students.update({"sex":"女"},{$push:{"books":"跟着三毛去流浪"}},true,true)
更新完成后,数据如下:
{ "_id" : ObjectId("532a545274d02410efb93692"), "books" : [ "跟着三毛去流浪" ], "name" : "赵小乐", "score" : { "math" : 53, "english" : 83, "chinese" : 20 }, "sex" : "女" } { "_id" : ObjectId("532a545274d02410efb93693"), "books" : [ "跟着三毛去流浪" ], "name" : "赵小千", "score" : { "math" : 13, "english" : 26, "chinese" : 47 }, "sex" : "女" } { "_id" : ObjectId("532a545274d02410efb93694"), "books" : [ "跟着三毛去流浪" ], "name" : "赵小斌", "score" : { "math" : 76, "english" : 37, "chinese" : 89 }, "sex" : "女" } { "_id" : ObjectId("532a545274d02410efb93698"), "books" : [ "跟着三毛去流浪" ], "name" : "赵小玲", "score" : { "math" : 8, "english" : 79, "chinese" : 41 }, "sex" : "女" }