更新整篇文檔
語法:
db.<collection>.update(<query>, <update>, <options>)
- query:定義了更新操作時篩選文檔的條件
- update:定義了更新內容
- options:聲明瞭一些更新操作的參數
將alice的賬戶餘額更改爲123:
db.accounts.update( { name: "alice" }, { name: "alice", balabce: 123 } )
更新返回結果:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
- nMatched:符合查詢條件的文檔
- nModified:被更新的文檔數量
幾個要注意的問題:
- 文檔主鍵 _id 不可被更改
- 在更新文檔時,只有第一篇符合查詢條件的文檔纔會被更新
更新文檔特定字段
文檔更新操作符:
- $set:更新或新增字段
{ $set: { <field1>: <value1>, ... } }
- $unset:刪除字段
{ $unset: { <field1>: "", ... } }
- $rename:重命名字段
{ $rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
- $inc:加減字段值
{ $inc: { <field1>: <amount1>, ... } }
- $mul:相乘字段值
{ $mul: { <field1>: <number1>, ... } }
- $min:和原值比較,取較小的那個值
{ $min: { <field1>: <value1>, ... } }
- $max:和原值比較,取較大的那個值
{ $max: { <field1>: <value1>, ... } }
數組更新操作符
- $addToSet:向數組字段中添加元素
{ $addToSet: { <field1>: <value1>, ... } }
- $pop:從數組中刪除元素,只能刪除第一個或者最後一個
{ $pop: { <field>: <-1 | 1>, ... } }
- $pull:從數組字段中刪除特定元素
{ $pull: { <field1>: <value | condition>, ... } }
- $pullAll:從數組字段中刪除特定元素
{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
// 這個命令相當於:
{ $pull: { <field1>: { $in: [ <value1>, <value2> ... ] }, ... } }
- $push:向數組中添加元素。和 $addToSet 命令一樣,如果 $push 命令中指定的數組字段不存在,這個字段會被添加到原文檔中。
{ $push: { <field1>: <value1>, ... } }
將karen的賬戶文檔複製爲lawrence的賬戶文檔:
db.accounts.find(
{ name: "karen" },
{ _id: 0 }
).forEach( function(doc) {
var newDoc = doc;
newDoc.name = "lawrence";
db.accounts.insert(newDoc);
} )
更多文檔選項 < options >
- multi:更新一個或者多個文檔
{ multi: <boolean> }
到目前爲止,我們update命令中使用的篩選條件只對應於一篇文檔。
在默認情況下,即使篩選條件對應了多篇文檔,update命令仍然只會更新一篇文檔。
要更新所有符合篩選條件的文檔,就需要把multi字段設爲true。
db.accounts.update(
{},
{ $set: {
currency: "USD"
}
},
{ multi: true }
)
注意:MongoDB只能保證單個文檔操作的原子性,不能保證多個文檔操作的原子性。
- upsert:更新或者創建文檔
{ upsert: <boolean> }
默認情況下,update命令的篩選條件沒有匹配任何文檔,則不會進行任何操作。
如果篩選條件沒有匹配任何文檔而需要創建新文檔的話,就需要將upsert設置爲true。
db.accounts.update(
{ name: "maggie" },
{ $set: { balance: 700 } },
{ upsert: true }
)
另外一個可以用來更新文檔的命令
db.<collection>.save(<document>)
如果document文檔中包含了 _id 字段,save()命令將會調用 db.collection.update()命令(upsert: true)