update(filter,update,options)
- 參數filter用于指定一個查詢,查詢選擇將要更新的目標記錄。
- 參數update用于指定更新信息,也可以使用操作符來完成。
- 參數options用于指定更新文檔時的選項,可選值包括:upsert和multi。upsert可以指定如果數據存在就更新,不存在就創建數據;multi選項指定是否應該更新所有匹配的文檔,或者只更新第一個文檔(默認行為)。
更新操作符
- 覆蓋更新 任何忽略的字段都被移除(文檔被覆蓋)
update : {} 不適用操作符
- 不存在時新增
options : {upsert:true}
- $inc 增加新值
update : {$inc:{<field1>: <value1>,...}
- $set 設置字段值
update : {$set:{<field1>: <value1>,...}
- $unset 刪除指定字段值
update : {$unset:{<field1>: <value1>,...}
- $rename 修改字段名
update : {$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
- $min,$max 數值比較 true更新,false不更新
update : { $min: { <field1>: <value1>, ... } }
update : { $max: { <field1>: <value1>, ... } }
- $setOnInsert 在{upsert:true}并且觸發新增操作時,作為默認值新增
- $currentDate 當前日期 可設置類型$type date或者timestamp
update : { $currentDate: { <field1>: {$type: <type>}, ... } }
數組操作符
- $push 在指定字段中添加某個值
通過$push操作符可以在指定字段中添加某個值。
- 如果該字段是個數組,那么該值將被添加到數組中。
- 如果該字段尚不存在,那么該字段的值將被設置為數組。
- 如果該字段存在,但不是數組,那么將會拋出異常。
- 如果給定的值是個數組,那么該數組被看做是一個元素,添加給定字段中(If the value is an array, $push appends the whole array as a single element)。
- 使用$each 添加多個值到指定字段
- 使用$sort 排序
update : { $push: { <field1>: <value1>, ... } }
- $push $each 在指定字段插入多個值
update : { $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }
在使用$each是還可以使用$slice修改操作符,通過這種方式可以限制$push操作符中數組內元素的數量。 $slice可以是正數,負數或0。
- 正數將保證數組中的前n個元素會被保留
- 使用負數將保證數組中的最后n個元素會被保留
- 而使用0則表示清空數組
注意:操作符$slice必須是$push操作中的第一個修改操作符。
操作符$each和$slice操作符保證不僅新值會被添加到數組中,還能保證吧數組的大小限制為指定值。
update : { $push: { <field>: { $each: [ <value1>, ... ],$slice:<number> } } }
- $sort 排序
$sort修改操作符必須與$each修改操作符一起使用。你可以傳遞一個空數組給$each操作符,這樣就可以只使$sort操作符起作用,達到不添加元素,只對原數組排序的目的。
在對數組元素進行排序時,1表示升序,-1表示降序。如果數組元素是文檔,我們可以根據整個文檔或者是文檔中某個具體字段來進行排序。在以前版本中(2.6版本之前)$sort只能根據文檔中的具體字段進行排序。假設數組元素是文檔,如果只是根據文檔中某個字段進行排序,需要使用字段和方向來進行排序,例如, { field: 1 } or { field: -1 },不要使用{ "arrayField.field": 1 }這種方式進行排序。
數組元素不是文檔,value1 = <string|number|boolean>
{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$sort: <1 or -1>
}
}
}
數組元素是文檔,value1 = {field:<value>}
{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$sort: { field: <1 or -1> }
}
}
}
- $addToSet 向數組中添加數據
操作符$addToSet 是另一個可用于向數組中添加數據的命令。不過,只有數據不存在的時候,該操作符才能將數據添加到數組中(The $addToSet operator adds a value to an array unless the value is already present, in which case$addToSet does nothing to that array)。它的 工作方式與$push不同,$addToSet確保在添加元素時不會與數組中元素重復($addToSet only ensures that there are no duplicate items added to the set and does not affect existing duplicate elements),但是$push可以添加重復元素。在使用$addToSet時,可以使用$each操作符指定的額外的參數。
如果添加的給定值是個數組,則會把整個數組看做一個元素添加到給定字段中。
update : { $addToSet: { <field1>: <value1>, ... } }
- $pop 從數組中刪除單個元素
操作符$pop可以從數組中刪除單個元素。該操作符允許刪除數組中的第一個元素或者最后一個元素,具體取決于傳入的參數。如果傳遞的參數為-1表示刪除數組第一個元素,1表示刪除數組最后一個元素。如果刪除的指定字段field不是數組,則會報錯。
update: { $pop: { <field>: <-1 | 1>, ... } }
- $pull 刪除所有指定值
通過使用$pull操作符可以從數組中刪除所有指定的值或者符合給定條件的值。如果數組中有多個元素的值相同,那么該操作符是非常有用的。
update : { $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
- $pullAll刪除數組中多個元素
我們還可以從數組中刪除多個含有不同值的元素。該操作符將接收一個希望移除元素的數組。不同于$pull,$pull從數組中刪除匹配查詢條件的數組元素。
update : { $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }