MongoDB:比较ArrayFilter中的两个字段

时间:2019-12-13 13:14:46

标签: mongodb

想象一下我在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部分?

1 个答案:

答案 0 :(得分:1)

可以使用聚合查询根据条件选择arrayField元素(数组有元素;在这种情况下,有两个元素作为子文档)。

可以使用$filter聚合运算符来过滤文档的

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 } } ) );