Mongo系列之update
文章目錄
- 1. 前言
- 2. update()
- 3. updateOne()和updateMany()
- 3.1 writeConcern參數使用的例子
- 3.2 collation參數使用的例子
- 3.3 arrayFilters 參數的例子
- 4. replaceOne()
- 5. 更新操作符
- 6. 參考文獻
1. 前言
db.xx.update():更新一條或多條,通過multi參數控制。
db.xx.updaetOne():更新一條。
db.xx.updateMany():更新多條。
2. update()
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document>} )# 參數解釋; query : update的查詢條件,類似sql update查詢內where后面的。 update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set后面的 upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。 multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。 writeConcern :可選,拋出異常的級別。關于writeConcern參數使用的例子:
# 在writeConcern這個參數中制定了w 為 majority, wtimeout為 100:try {db.restaurant.updateOne({ "name" : "Pizza Rat's Pizzaria" },{ $inc: { "violations" : 3}, $set: { "Closed" : true } },{ w: "majority", wtimeout: 100 }); } catch (e) {print(e); }# 如果主服務器和至少一個輔助服務器在100毫秒內確認每個寫操作,則返回:{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }# 如果確認花費的時間超過了wtimeout限制,則會引發以下異常:WriteConcernError({"code" : 64,"errInfo" : {"wtimeout" : true},"errmsg" : "waiting for replication timed out" }) :3. updateOne()和updateMany()
在3.2之后的版本中,加入了一些新的方法。例如updateOne(),updateMany()等。updateOne()和updateMany()的用法都是一樣的,只不過前者只更新符合條件的一個文檔,后者更新符合條件的所有文檔。
db.collection.updateMany(<filter>,<update>,{upsert: <boolean>,writeConcern: <document>,collation: <document>,arrayFilters: [ <filterdocument1>, ... ]} )# 參數解釋; filter: update的查詢條件,類似sql update查詢內where后面的。 update: update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set后面的。 upsert: 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。 writeConcern: 可選,拋出異常的級別。 collation: 可選的。指定排序規則。集合允許用戶在字符串比較中指定特定的語言規則,例如字母大寫和重音符號的規則。 arrayFilters: 可選的。 數組過濾條件,用于確定數組中那些元素需要更新。3.1 writeConcern參數使用的例子
關于writeConcern參數使用的例子與上面的update中該參數的使用是一致的。
3.2 collation參數使用的例子
Collation Locales and Default Parameters
假設數據庫中有一個mycoll集合,集合中有如下文檔:
在collation參數中進行了如下操作:
db.myColl.updateOne({ category: "cafe" },{ $set: { status: "Updated" } },{ collation: { locale: "fr", strength: 1 } } );3.3 arrayFilters 參數的例子
準備如下數據:
db.students.insert([{ "_id" : 1, "grades" : [ 95, 92, 90 ] },{ "_id" : 2, "grades" : [ 98, 100, 102 ] },{ "_id" : 3, "grades" : [ 95, 110, 100 ] } ]) //在<update>中,使用$[<identifier>]運算符來定義標識符,然后在數組過濾器中引用該標識符。 如下面所使用的element。 db.students.update({ grades: { $gte: 100 } },{ $set: { "grades.$[element]" : 100 } },{multi: true,arrayFilters: [ { "element": { $gte: 100 } } ]} )更新后結果:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 100, 100 ] }4. replaceOne()
替換文檔。
db.collection.replaceOne(<filter>,<replacement>,{upsert: <boolean>,writeConcern: <document>,collation: <document>} )下面的例子對 users 集合使用 db.collection.replaceOne() 方法將通過過濾條件 name 等于 “sue” 匹配到的 第一個 文檔替換為新文檔:
db.users.replaceOne({ name: "abc" },{ name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } } )其余參數的使用與updateOne()/updateMany()相同。
5. 更新操作符
| 字段 | |
| $currentDate | 將字段的值設置為當前日期(日期或時間戳)。 |
| $inc | 將字段的值增加指定的數值。可以同時寫多個字段增加/減少多個指定的數值。 |
| $min | 僅當指定值小于現有字段值時才更新該字段。 |
| $max | 僅當指定值大于現有字段值時才更新該字段。 |
| $mul | 將字段的值乘以指定的數量。 |
| $rename | 重命名字段名。 |
| $set | 設置文檔中字段的值。 |
| $setOnInsert | 如果更新導致插入文檔,則設置字段的值。 對修改現有文檔的更新操作沒有影響。 |
| $unset | 從文檔中刪除指定的字段。 |
| 數組 | |
| $ | 充當占位符,以更新與查詢條件匹配的第一個元素。 |
| $[] | 充當占位符,以更新匹配查詢條件的文檔的數組中的所有元素。 |
| $[] | 充當占位符,以更新與查詢條件匹配的文檔的所有與arrayFilters條件匹配的元素。 |
| $addToSet | 僅當元素不存在于集合中時才將它們添加到數組中。 |
| $pop | 刪除數組的第一項或最后一項。 |
| $pull | 刪除所有與指定查詢匹配的數組元素。 |
| $push | 向數組中添加一項。 |
| $pullAll | 從數組中刪除所有匹配的值。 |
| 修飾符 | |
| $each | 修改$ push和$ addToSet運算符以附加多項以進行數組更新。 |
| $position | 修改$push運算符,以指定要添加元素的數組中的位置。 |
| $slice | 修改$push運算符以限制更新數組的大小。 |
| $sort | 修改$push運算符以對存儲在數組中的文檔重新排序。 |
| 位 | |
| $bit | 執行整數值的按位AND,OR和XOR(異或)更新。 |
6. 參考文獻
[1] MongoDB 中文文檔
[2] MongoDB 官方文檔
[3] mongoDB 中文社區
[4] MongoDB update 更新命令匯總
[5] mongodb中對字符串按照數值來排序【collation】
[6] Collation Locales and Default Parameters
總結
以上是生活随笔為你收集整理的Mongo系列之update的全部內容,希望文章能夠幫你解決所遇到的問題。