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" : "女" }