如何将值更新到 mongodb 文档中的嵌套对象数组?
How to update the value to the nested object array in mongodb document?
我有以下文档需要更新。
{
"_id": "Colorcode_1",
"Combination": [
{
"color": [
{
"mixture": [
"Red",
"Green"
]
}
],
"code": "Maroon"
},
{
"color": [
{
"mixture": [
"Yellow",
"Green"
]
}
],
"code": "Light Green"
}
]
}
现在我需要做的是 更新 文档,方法是在“代码”为“栗色”的“混合”字段中添加值“蓝色”。像这样的东西。这需要使用 $addToSet
来完成
{
"_id": "Colorcode_1",
"Combination": [
{
"color": [
{
"mixture": [
"Red",
"Green",
"Blue"
]
}
],
"code": "Maroon"
},
{
"color": [
{
"mixture": [
"Yellow",
"Green"
]
}
],
"code": "Light Green"
}
]
}
有关此的任何帮助都将非常有帮助。
由于数据模型的原因,我发现此更新很困难,希望您能得到 better/simpler 答复。
无论如何,这是您可以做到的一种方法。我会在 more/different 数据上测试它以确保它是正确的。
db.collection.update({
"_id": "Colorcode_1",
"Combination.code": "Maroon"
},
[
{
"$set": {
"Combination": {
"$map": {
"input": "$Combination",
"as": "elem",
"in": {
"$cond": [
{ "$eq": [ "$$elem.code", "Maroon" ] },
{
"$mergeObjects": [
"$$elem",
{
"color": {
"$map": {
"input": "$$elem.color",
"as": "colorElem",
"in": {
"$cond": [
{
"$reduce": {
"input": { "$objectToArray": "$$colorElem" },
"initialValue": false,
"in": {
"$or": [
"$$value",
{ "$eq": [ "$$this.k", "mixture" ] }
]
}
}
},
{
"mixture": {
"$setUnion": [ "$$colorElem.mixture", [ "Blue" ] ]
}
},
"$$colorElem"
]
}
}
}
}
]
},
"$$elem"
]
}
}
}
}
}
])
在 mongoplayground.net 上试用。
这是带有 arrayFilters 的选项:
db.collection.update({
"Combination.code": "Maroon"
},
{
"$addToSet": {
"Combination.$[x].color.$[y].mixture": "Blue"
}
},
{
arrayFilters: [
{
"x.code": "Maroon"
},
{
"y.mixture": {
$exists: true
}
}
]
})
解释:
- 过滤所有具有 code:Marron 的文档,如果集合很大
,最好在该字段上有索引
- 如果混合物存在(由 y arrayFilter 标识),则使用 arrayFilter x.code 将数组元素添加到混合物中
我有以下文档需要更新。
{
"_id": "Colorcode_1",
"Combination": [
{
"color": [
{
"mixture": [
"Red",
"Green"
]
}
],
"code": "Maroon"
},
{
"color": [
{
"mixture": [
"Yellow",
"Green"
]
}
],
"code": "Light Green"
}
]
}
现在我需要做的是 更新 文档,方法是在“代码”为“栗色”的“混合”字段中添加值“蓝色”。像这样的东西。这需要使用 $addToSet
来完成
{
"_id": "Colorcode_1",
"Combination": [
{
"color": [
{
"mixture": [
"Red",
"Green",
"Blue"
]
}
],
"code": "Maroon"
},
{
"color": [
{
"mixture": [
"Yellow",
"Green"
]
}
],
"code": "Light Green"
}
]
}
有关此的任何帮助都将非常有帮助。
由于数据模型的原因,我发现此更新很困难,希望您能得到 better/simpler 答复。
无论如何,这是您可以做到的一种方法。我会在 more/different 数据上测试它以确保它是正确的。
db.collection.update({
"_id": "Colorcode_1",
"Combination.code": "Maroon"
},
[
{
"$set": {
"Combination": {
"$map": {
"input": "$Combination",
"as": "elem",
"in": {
"$cond": [
{ "$eq": [ "$$elem.code", "Maroon" ] },
{
"$mergeObjects": [
"$$elem",
{
"color": {
"$map": {
"input": "$$elem.color",
"as": "colorElem",
"in": {
"$cond": [
{
"$reduce": {
"input": { "$objectToArray": "$$colorElem" },
"initialValue": false,
"in": {
"$or": [
"$$value",
{ "$eq": [ "$$this.k", "mixture" ] }
]
}
}
},
{
"mixture": {
"$setUnion": [ "$$colorElem.mixture", [ "Blue" ] ]
}
},
"$$colorElem"
]
}
}
}
}
]
},
"$$elem"
]
}
}
}
}
}
])
在 mongoplayground.net 上试用。
这是带有 arrayFilters 的选项:
db.collection.update({
"Combination.code": "Maroon"
},
{
"$addToSet": {
"Combination.$[x].color.$[y].mixture": "Blue"
}
},
{
arrayFilters: [
{
"x.code": "Maroon"
},
{
"y.mixture": {
$exists: true
}
}
]
})
解释:
- 过滤所有具有 code:Marron 的文档,如果集合很大 ,最好在该字段上有索引
- 如果混合物存在(由 y arrayFilter 标识),则使用 arrayFilter x.code 将数组元素添加到混合物中