我有一个包含文档的集合,每个文档都包含一个子文档数组。给定一个新的子文档数组与这些文档中的数组字段具有相同的结构,我想基于我的新数组中的项的id字段替换我的集合中的文档中的所有数组元素,无论其值是什么元素是。
换句话说,我想通过它们的id字段查询集合中的数组元素,并用新数组中匹配id字段的数组元素替换它们。
示例:
收藏:
{
_id: "Document1",
array:
[
{id: 1, field2: "A", field3: "W"},
{id: 2, field2: "B", field3: "X"},
{id: 3, field2: "C", field3: "Y"}
]
},
{
_id: "Document2",
array:
[
{id: 1, field2: "A", field3: "E"},
{id: 2, field2: "B", field3: "F"},
{id: 3, field2: "C", field3: "G"},
{id: 4, field2: "D", field3: "H"}
]
},
{
_id: "Document3",
array:
[
{id: 1, field2: "A", field3: "R"},
{id: 2, field2: "B", field3: "S"}
]
}
新数组(包含要实施的更改):
[
{id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"},
{id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
]
这应该产生以下更新的集合:
{
name: "Document1",
array:
[
{id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"},
{id: 2, field2: "B", field3: "X"},
{id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
]
},
{
name: "Document2",
array:
[
{id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"},
{id: 2, field2: "B", field3: "F"},
{id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"},
{id: 4, field2: "D", field3: "H"}
]
},
{
name: "Document3",
array:
[
{id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"},
{id: 2, field2: "B", field3: "S"}
]
}
注意:包含新值的新数组将包含与每个文档的数组完全相同的字段。我想在id匹配的地方完全替换数组元素。
答案 0 :(得分:0)
我不确定我是否理解你的观点。 如果这个代码是您的答案,那么c#代码应该易于实现
db.test.update(
{
'array.id' : { $in : [1, 3]}
},
{
$set :
{
"array.0" : {id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"},
"array.2" : {id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
}
},
{
upsert: false,
multi: true,
}
);
<强>更新强> 解决方案不是一个非常简单的更新查询,但它工作正常:
var toBeUpdate = [
{id: 1, field2: "FIELD2_UPDATED", field3: "FIELD3_UPDATED"},
{id: 3, field2: "FIELD2_ANOTHER_UPDATE", field3: "FIELD3_ANOTHER_UPDATE"}
];
db.test.find().forEach(function (item)
{
var array = item.array;
for(var index = 0; index < array.length; index++)
{
for(var index2 = 0; index2 < toBeUpdate.length; index2++)
{
if(array[index].id == toBeUpdate[index2].id)
{
if(toBeUpdate[index2].field1 != undefined) array[index].field1 = toBeUpdate[index2].field1;
if(toBeUpdate[index2].field2 != undefined) array[index].field2 = toBeUpdate[index2].field2;
if(toBeUpdate[index2].field3 != undefined) array[index].field3 = toBeUpdate[index2].field3;
break;
}
}
}
db.test.update({'_id' : item._id}, item);
}
)