想象一下我在mongo集合中有这样的对象:
{
"id": "some id",
"arrayField": [
{
"id": "1",
"field1": "value A",
"field2": "value B"
}, {
"id": "2",
"field1": "value C",
"field2": "value C"
}
]
}
我想用ArrayFilters编写UpdateOne查询以更新arrayField的元素,其中 field1 的值等于 field2 的值。根据上面的示例,执行此查询后,ArrayFilter应该选择arrayField的第二个元素(“ id”:“ 2”),因为它的field1等于field2。如何为该查询编写ArrayFilters部分?
答案 0 :(得分:1)
可以使用聚合查询根据条件选择arrayField
元素(数组有元素;在这种情况下,有两个元素作为子文档)。
Array字段。将查询应用于问题中的样本文档时,该查询仅返回文档中带有"id": "2"
的子文档。
db.test.aggregate( [
{
$project: {
arrayField: {
$filter: {
input: "$arrayField",
as: "ele",
cond: { $eq: [ "$$ele.field1", "$$ele.field2" ] }
}
}
}
}
] )
{
"id" : "some id",
"arrayField" : [
{
"id" : "2",
"field1" : "value C",
"field2" : "value C"
}
]
}
如果要更新集合中的文档,请对聚合查询的结果使用以下脚本:
db.test.aggregate( [
{
$project: { // fill the code from the above query here...
}
] ).forEach( doc => db.test.updateOne( { _id: doc._id }, { $set: { arrayField: doc.arrayField } } ) );