這里以我的檔案為例:
[{
_id: ObjectId("609391f436e519039a634311"),
name: "Class A",
numOfStudents: 10,
students: [{
name: "Student A",
age: 10,
}, {
name: "Student B",
age: 10,
}]
}]
我想更新班級的一些值并洗掉班級所有學生的一些資訊。所以我在 updateOne 中使用 $set 和 $unset,如下所示:
db.class.updateOne({
_id: ObjectId("609391f436e519039a634311")
}, {
$set: { something: "Something for describe" },
$unset: { "students.$[].age": "" }
})
但是現在,我想通過另一個欄位的值將 $set 值設定為某個值,我必須將上面的腳本轉換為如下所示的管道:
db.class.updateOne({
_id: ObjectId("609391f436e519039a634311")
}, [
{
$set: { something: "$name" },
}, {
$unset: [
"students.$[].age"
]
}
])
但它沒有用,它拋出了一個錯誤:
Invalid $unset :: caused by :: FieldPath field names may not start with '$'. Consider using $getField or $setField.
請給我一個建議。
uj5u.com熱心網友回復:
您不能在聚合中使用我們在更新運算子中使用的路徑。當聚合時,您只能使用聚合運算子,唯一的例外是匹配階段,您也可以使用查詢運算子。
查詢1
- 未定年齡
測驗代碼在這里
update(
{"_id": ObjectId("609391f436e519039a634311")},
[{"$set": {"something": "$name"}},
{"$unset": ["students.age"]}])
查詢2
- 你可以使用
"$$REMOVE"系統變數,如果一個欄位得到這個值它被洗掉 - 這就像將所有年齡欄位設定為具有值,
$$REMOVE以便將它們洗掉
測驗代碼在這里
update(
{"_id": ObjectId("609391f436e519039a634311")},
[{"$set": {"something": "$name"}},
{"$set": {"students.age": "$$REMOVE"}}])
查詢 3
- 從學生我們只保留
name(=>age被洗掉) - 您必須手寫所有要保留的欄位
測驗代碼在這里
update(
{"_id": ObjectId("609391f436e519039a634311")},
[{"$set": {"something": "$name"}},
{"$set":
{"students":
{"$map": {"input": "$students", "in": {"name": "$$this.name"}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314276.html
上一篇:在聚合中組合匹配過濾器
