MongoDB基礎——更新文檔

更新整篇文檔

語法:

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)

發佈了72 篇原創文章 · 獲贊 300 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章