我的檔案格式如下:
{
_id: 'something',
topLevelProp: 'top'
obj: {
prop1: { a: 'a', b: 'b' },
prop2: { a: 'x', b: 'y'},
prop3: {a: 'x'}
}
}
我想更新里面的所有子檔案obj
以包含topLevelProp
.
因此,結果將是:
{
_id: 'something',
topLevelProp: 'top'
obj: {
prop1: { a: 'a', b: 'b', anotherProp: 'top' },
prop2: { a: 'x', b: 'y', anotherProp: 'top'},
prop3: {a: 'x', anotherProp: 'top'}
}
}
我能得到的最接近的是
db.update({_id: "something")}, {$set: {'obj.$.anotherProp': '$topLevelProp'}})
實際上不起作用的東西,給出了這個寫入錯誤:Cannot apply array updates to non-array element obj
.
猜猜這是因為$
它用于陣列,而不是物件。正如預期的那樣, using$[]
會產生類似的錯誤。
有沒有辦法做這樣的事情?
uj5u.com熱心網友回復:
用于$objectToArray
轉換obj
為 kv 元組陣列。$mergeObjects
添加密鑰。最后用于$arrayToObject
恢復到原始物件形式。
db.collection.update({},
[
{
"$addFields": {
"obj": {
"$objectToArray": "$obj"
}
}
},
{
"$addFields": {
"obj": {
"$map": {
"input": "$obj",
"as": "o",
"in": {
k: "$$o.k",
v: {
"$mergeObjects": [
"$$o.v",
{
anotherProp: "$topLevelProp"
}
]
}
}
}
}
}
},
{
"$addFields": {
"obj": {
"$arrayToObject": "$obj"
}
}
}
],
{
multi: true
})
蒙戈游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/522643.html