Update 操作
Incrementing & Decrementing Values
更新 Document 時,使用 $inc 可增減數值。
# 找尋 field1 的值為 value1 的 Document,然後將 field2 的值增加 5
db.collection_name.updateOne({field1: value1}, {$inc: {field2: 5}})
# 找尋 field1 的值為 value1 的 Document,然後將 field2 的值減少 10
db.collection_name.updateOne({field1: value1}, {$inc: {field2: -10}})
# 可一次更新多個值
db.collection_name.updateOne({field1: value1}, {$inc: {field2: value2, field3: value3, ...}})
# 可搭配 $set,但 $inc 及 $set 的目標欄位不能相同。
db.collection_name.updateOne({field1: value1}, {$inc: {field2: value}, $set: {field3: value3}})
Using "$min", "$max" and "$mul"
更新 Document 時……
- 使用 $min 可將超過指定值的值更新為指定值
- 使用 $max 可將未滿指定值的值更新為指定值
- 使用 $mul 可將儲存值乘以 n 倍
# 找尋 field1 的值為 value1 的 Document,然後檢視 field2 的值是否超過 value2,
# 超過則將 field2 的值更新為 value2。
db.collection_name.updateOne({ field: value }, { $min: { field2: value2 } })
# 找尋 field1 的值為 value1 的 Document,然後檢視 field2 的值是否未滿 value2,
# 未滿則將 field2 的值更新為 value2。
db.collection_name.updateOne({ field1: value1 }, { $max: { field2: value2 } })
# 找尋 field1 的值為 value1 的 Document,然後將 field2 的值與 value2 相乘。
db.collection_name.updateOne({ field1: value1 }, { $mul: { field2: value2 } })
Getting Rid of Fields
更新 Document 時……
- 使用 $set 可將 field 的值變更為 null 等各種型別的資料
- 使用 $unset 可移除特定欄位
# 找尋 field1 的值為 value1 的 Document,然後移除 field2。
db.collection.updateOne({ field1: value1 }, {$unset: { field2: "" }})
# 也可在同一操作中合併使用 $set 與 $unset
# $set: { field3: null} 只是將值改為空值,field 依然存在。
db.collection.updateOne({ field1: value1 }, {$unset: { field2: "" }, $set: { field3: null}})
Renaming Fields
更新 Document 時……
- 使用 $rename 可變更 field 名稱
# 找尋 field1 的值為 value1 的 Document,並更新其 field2、field3……的欄位名稱。
db.collection.updateOne({ field1: value1 },
{$rename: {field2: "newFieldName", field3: "newFieldName",...}})
Understanding "upsert()"
更新 Document 時,可設定 upsert 選項,如此若更新標的不存在,將會插入新的 Document。
# 找尋 field1 的值為 value1 的 Document。若找到符合條件的 Document,就將 field2 的值更新為 value2;# 若找不到符合條件的 Document,則新增一筆 {field1: value1, field2: value2} 的 Document。
db.collection_name.updateOne({field1: value1}, {$set: {field2: value2}}, {upsert: true})
Updating Matched Array Elements
循序漸進理解如何更新陣列內的資料
- 在不熟練 update 操作或不清楚資料結構時,先用 find 建立初步的理解。
範例:假設更新標的是 Array,其元素為 Object,並且使用 $gte Operator。
db.collection_name.find({arrayName: {$elemMatch: {key1: value1, key2: {$gte: value2}}}})
- 確定更新標的後,可使用
$
SET 更新內容,如此可在鍵值對不存在時新增鍵值對。
範例:$
在此指向 $elemMatch 找到的 Document
db.collection_name.updateMany(
{arrayName: {$elemMatch: {key1: value1, key2: {$gte: value2}}}},
{$set: {"arrayName.$.field3": value3}})
- 注意!
$
的作用對象是陣列中符合篩選條件的第一個元素
Updating All Array Elements
欲更新陣列內所有元素時,可使用 $[]
。
# 這段指令會找出符合條件的陣列,但只會更新陣列中第一個擁有指定 key 的元素。
db.collection_name.updateMany({"arrayName.key": value}, {$inc: {"arrayName.$.key": 1}})
# 這段指令會找出符合條件的陣列,並更新陣列中擁有指定 key 的所有元素。
db.collection_name.updateMany({"arrayName.key": value}, {$inc: {"arrayName.$[].key": 1}})
Finding & Updating Specific Fields
欲更新陣列內符合篩選條件的所有元素,可使用 $[<identifier>]
及 arrayFilters。
# 找到 arrayName 的元素包含 key1 大於 value1 的 Document,然後將 arrayName 當中所有符合
# arrayFilters 篩選條件的元素的 key2 的值變更為 value2。
db.collection_name.updateMany({"arrayName.key1": {$gt: value1}},
{$set: {"arrayName.$[ele].key2": value2}},
{arrayFilters: [{"ele.key1": {$gt: value3}}]})
Adding Elements to Arrays
想在陣列內添增一個新元素,可使用 $push。
範例:
db.collection_name.updateOne({field1: value1},
{$push: {field2: {field3: value3, field4: value4}}})
想在陣列內添增多個新元素,可使用 $push 與 $each。
範例:
db.collection_name.updateOne({field1: value1}, {$push: {field2: {$each: [{field3: value3, field4: value4}, {field5: value5, field6: value6}]}}})
在陣列內添增多個新元素時,可搭配 $sort、$slice 等選項,藉此決定以什麼形式將元素添加至陣列。
範例:
db.collection_name.updateOne({field1: value1}, {$push: {field2: {$each: [{field3: value3, field4: value4}, {field5: value5, field6: value6}], $sort: {frequency: -1}}}})
Removing Elements from Arrays
使用 $pull 可移除陣列中符合條件的所有元素
db.collection_name.updateOne({field1: value1}, {$pull: {field2: {field3: value3}}})
使用 $pop 可移除陣列中符合條件的第一個或最後一個元素
# 移除最後一個元素
db.collection_name.updateOne({field1: value1}, {$pop: {field2: 1}})
# 移除第一個元素
db.collection_name.updateOne({field1: value1}, {$pop: {field2: -1}})
Understanding "$addToSet"
$addToSet 與 $push 相似,差別在於前者只允許添增唯一值,後者可重複添加相同的值。
# 尋找 field1 的值為 value1 的 Document,然後在 arrayName 的值當中
# 添增 {field2: value2, field3: value3},除非 {field2: value2, field3: value3} 已經存在。
db.collection_name.updateOne({field1: value1},
{$addToSet: {arrayName: {field2: value2, field3: value3}}})