我有一個這樣的 mongo 檔案。
{
"_id": "a74e283a",
"data": [
{
"origin": "apple",
"edit": "fruit"
},
{
"origin": "grape",
"edit": "fruit"
},
{
"origin": "melon",
"edit": "fruit"
}
]
}
我希望能夠使用單個 mongo 命令插入和更新陣列,而不是在 find() 中使用條件,然后根據物件的存在運行 insert() 和 update() 。
例如,如果我用這個更新陣列:
{
"data": [
{
"origin": "apple",
"edit": "fruit_edit"
},
{
"origin": "pear",
"edit": "fruit"
}
]
}
結果必須是這樣的:
{
"_id": "a74e283a",
"data": [
{
"origin": "apple",
"edit": "fruit_edit"
},
{
"origin": "grape",
"edit": "fruit"
},
{
"origin": "melon",
"edit": "fruit"
},
{
"origin": "pear",
"edit": "friut"
}
]
}
uj5u.com熱心網友回復:
您可以使用聚合管道進行更新。將 a$set放入聚合管道并用于$reduce處理 upsert 邏輯。
在 中$reduce,將您的編輯陣列作為初始值。匹配時,只需保留累加器值,因為編輯已在累加器中。當有不匹配時,將陣列條目附加到累加器。
db.collection.update({},
[
{
$set: {
data: {
"$reduce": {
"input": "$data",
"initialValue": // assign your edit data as init value
[
{
"origin": "apple",
"edit": "fruit_edit"
},
{
"origin": "pear",
"edit": "fruit"
}
],
"in": {
"$cond": {
"if": {
$in: [
"$$this.origin",
"$$value.origin"
]
},
"then": "$$value",
"else": {
"$concatArrays": [
"$$value",
[
"$$this"
]
]
}
}
}
}
}
}
}
])
這是Mongo 游樂場供您參考。
uj5u.com熱心網友回復:
詢問
- 把你的新資料放在“ndata”上
- 另一個變數被定義為“ndata_origin”以僅執行專案 1 次
- 這會過濾舊資料,并洗掉所有新資料 => old-without-new
- 連接舊無新新資料
測驗代碼在這里
update({},
[{"$set":
{"data":
{"$let":
{"vars":
{"ndata":
[{"origin": "apple", "edit": "fruit_edit"},
{"origin": "pear", "edit": "fruit"}]},
"in":
{"$let":
{"vars": {"ndata_origin": "$$ndata.origin"},
"in":
{"$concatArrays":
[{"$filter":
{"input": "$data",
"cond":
{"$not": [{"$in": ["$$this.origin", "$$ndata_origin"]}]}}},
"$$ndata"]}}}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/340250.html
下一篇:聚合以創建具有嵌套檔案值的檔案
