轉自:http://www.mongoing.com/docs/tutorial/update-documents.html
更新
MongoDB提供如下方法更新集合中的文檔:
db.collection.updateOne() | 即使可能有多個文檔通過過濾條件匹配到,但是也最多也只更新一個文檔。 3.2 新版功能. |
db.collection.updateMany() | 更新所有通過過濾條件匹配到的文檔. 3.2 新版功能. |
db.collection.replaceOne() | 即使可能有多個文檔通過過濾條件匹配到,但是也最多也只替換一個文檔。 3.2 新版功能. |
db.collection.update() | 即使可能有多個文檔通過過濾條件匹配到,但是也最多也只更新或者替換一個文檔。 默認情況下, db.collection.update() 只更新 一個 文檔。要更新多個文檔,請使用 multi 選項。 |
這些方法接收(如下)參數:
行為表現
原子性
MongoDB中所有的寫操作在單一文檔層級上是原子的。更多關於MongoDB和原子性的信息,請參見 原子性和事務處理。
_id 字段
一旦設定,你不能更新 _id 字段的值,你也不能用有不同 _id 字段值的替換文檔來替換已經存在的文檔。
文檔大小
當執行更新操作增加的文檔大小超過了為該文檔分配的空間時。更新操作會在磁盤上重定位該文檔。
字段順序
MongoDB按照文檔寫入的順序整理文檔字段,除了 如下的情況:
-
_id 字段始終是文檔中的第一個字段。
-
包括字段名稱的 renaming 操作可能會導致文檔中的字段重新排序。
在 2.6 版更改: 從2.6版本開始,MongoDB主動嘗試保持字段在文檔中的順序。 2.6版本之前,MongoDB不會主動保持文檔中的字段的順序。
Upsert 選項
如果 db.collection.update(),db.collection.updateOne(), db.collection.updateMany() 或者 db.collection.replaceOne() 包含 upsert : true 並且 沒有文檔匹配指定的過濾器,那么此操作會創建一個新文檔並插入它。如果有匹配的文檔,那么此操作修改或替換匹配的單個或多個文檔。
更多關於新文檔創建的細節,請參考該方法的詳細頁。
示例集合
本頁示例使用 mongo shell 中的 db.collection.find() 方法。在 mongo shell 中,如果返回的游標沒有賦給使用 var 關鍵字的變量,那么該游標會自動迭代20次 [1] 來打印出結果中的前20個文檔。
要添加示例中涉及的 users 集合,在 mongo shell中運行如下命令:
注解
如果 users 集合中已經包含了相同 _id 值的文檔,你需要在插入示例文檔前 drop 該集合( db.users.drop() )。
db.users.insertMany( [ { _id: 1, name: "sue", age: 19, type: 1, status: "P", favorites: { artist: "Picasso", food: "pizza" }, finished: [ 17, 3 ], badges: [ "blue", "black" ], points: [ { points: 85, bonus: 20 }, { points: 85, bonus: 10 } ] }, { _id: 2, name: "bob", age: 42, type: 1, status: "A", favorites: { artist: "Miro", food: "meringue" }, finished: [ 11, 25 ], badges: [ "green" ], points: [ { points: 85, bonus: 20 }, { points: 64, bonus: 12 } ] }, { _id: 3, name: "ahn", age: 22, type: 2, status: "A", favorites: { artist: "Cassatt", food: "cake" }, finished: [ 6 ], badges: [ "blue", "Picasso" ], points: [ { points: 81, bonus: 8 }, { points: 55, bonus: 20 } ] }, { _id: 4, name: "xi", age: 34, type: 2, status: "D", favorites: { artist: "Chagall", food: "chocolate" }, finished: [