Preface :
透過 interactive shell 中的 update() 函數, 你可以對滿足 matching criteria 的所有文件進行更新. 底下是該函數的語法說明 :
(Related driver docs: Java, Python, Ruby, PHP, Perl)
db.collection.update( criteria, objNew, upsert, multi )
- upserts
upsert 參數為 update() 函數的第三個參數, 如果你傳入 true 則意味 "update the document if present; insert (a single document) if missing", 而 MongoDB 透過第一個參數 criteria 來決定更新的文件是否存在.
- save() in the mongo shell
在 mongo shell 中, 如果你要更新的文件只有一個, 你可以使用 save() 函數 :
Modifier Operations :
透過 Modifier operations 可以很有效率與方便的更新一個已存在的 document. 考慮下面範例 :
上面範例的步驟 : 查詢 > 資料取回 > 修改資料 > 將修改資料存回. 相當直覺也相當沒有效率! 透過 Modifier Operation 可以有以下好處 :
要進行 atomic update, 可以使用 update operators (由 '$' 開頭的 operator). 底下是一個簡單範例 :
但你可能希望能同時更新一個以上的 fields, 這時你可以使用 $set operator :
底下我們來看看其他的 Modifier operators :
- $inc
- { $inc : { field : value } }
- $set
- { $set : { field : value } }
- $unset
- { $unset : { field : 1} }
- $push
- { $push : { field : value } }
Multiple arrays may be updated in one operation by comma separating the field : value pairs :
- $pushAll
- { $pushAll : { field : value_array } }
- $addToSet and $each
- { $addToSet : { field : value } }
To add a list of several values to the set use the $each qualifier :
- { $addToSet : { a : { $each : [ 3 , 5 , 6 ] } } }
Removes the last element in an array (ADDED in 1.1)
Removes the first element in an array (ADDED in 1.1).
- $pull
Removes all occurrences of value from field, if field is an array. If field is present but is not an array, an error condition is raised.
In addition to matching an exact value you can also use expressions ($pull is special in this way) :
- $pullAll
- { $pullAll : { field : value_array } }
- $rename Version 1.7.2+ only.
- { $rename : { old_field_name : new_field_name } }
- $bit v1.8+.
- {$bit : { field : {and : 5}}}
- {$bit : {field : {or : 43}}}
- {$bit : {field : {and : 5, or : 2}}}
The $ positional operator : v1.4+
operator $ (by itself) 意指 "position of the matched array item in the query". 可以透過它找到 array member 並進行操作. 假如有範例如下 :
上面的 operator $ 是指在 array 中比對到的第一個 matched item. 注意的是這個 positional operator $ 不適合用在 update() 方法中 upsert 參數為 true 情況下. 因為當 criteria 沒有滿足代表該 document 不存在時, "$" 將會被視為 field name 而不是原先的 positional operator 而造成不可預期結果!
Note :
Using "$unset" with an expression "array.$" will result in the array item becoming null, not being removed. You can issue an update with "{$pull:{x:null}}" to remove all nulls. $pull can now do much of this so this example is now mostly historical :
Upserts with Modifiers :
如果你在 update() 中設定 upsert=true, 並使用 modifier operation. 則當Collection 中沒有文件滿足 criteria, 該筆 criteria (進行 modifier operation) 會被 insert 到 collection :
但是在 update() 中使用 modifier 還是有些限制. 因為當你有不只一個 modifier 且 modifier 指向同一個 field 的情況不被允許 :
Blocking :
在 1.5.2 版後, multi updates 有實作 synchronize 保護的功能, 當你有大筆的資料需要插入到 database 但又希望進行 atomic 操作時可以使用 $atomic flag. 底下是簡單範例 :
補充說明 :
* Manual > Updating > Atomic Operations
* Manual > Updating > findAndModify Command
沒有留言:
張貼留言