【问题标题】:Mongo Add Fields to an Array Object from another Array Object based on matching conditionMongo根据匹配条件从另一个数组对象添加字段到一个数组对象
【发布时间】:2022-11-14 15:29:30
【问题描述】:

我正在尝试在 Mongo 中编写一个聚合,结果如下所示:请建议我如何构建 Mongo 聚合以实现我的输出。

集合(输入):这里我想根据匹配条件“cf_id”向“wkObj.cFS”对象添加一个键“qf_id”

输入文件:

[
  {
    "dataObj": {
      "dataObj_id": "test_1",
      "cFS": {
        "data": [
          {
            "cf_id": "123",
            "name": "cf_1"
          },
          {
            "cf_id": "456",
            "name": "cf_2"
          }
        ]
      }
    },
    "cfCoreData": [
      {
        "cf_id": "123",
        "qf_id": "QF_1989"
      },
      {
        "cf_id": "456",
        "qf_id": "QF_6090"
      }
    ]
  }
]

预期结果:

[
  {
    "cfCoreData": [
      {
        "cf_id": "123",
        "qf_id": "QF_1989"
      },
      {
        "cf_id": "456",
        "qf_id": "QF_6090"
      }
    ],
    "dataObj": {
    "dataObj_id": "test_1",
      "cFS": {
        "data": [
          {
            "cf_id": "123",
            "name": "cf_1",
            "qf_id": "QF_1989"
          },
          {
            "cf_id": "456",
            "name": "cf_2",
            "qf_id": "QF_6090"
          }
        ]
      }
    }
  }
]

当我尝试以下查询时,它作为数组添加

db.collection.aggregate({
  $addFields: {
    "dataObj.cFS.data.qf_id": "$cfCoreData.qf_id"
  }
})

请提出一种编写 mongo 查询的最佳方法来实现我的结果。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:
    1. $set - 设置 dataObj.cFS.data 字段。

      1.1。 $map - 迭代dataObj.cFS.data 中的每个元素并返回一个新数组。

      1.1.1。 $mergeObjects - 将当前迭代对象 (data) 与结果合并1.1.1.1.

      1.1.1.1。 $first - 从结果中获取第一个过滤的文档1.1.1.1.1.

      1.1.1.1.1。 $filter - 通过匹配cf_id 从cfCoreData 数组中过滤文档。

      db.collection.aggregate([
        {
          $set: {
            "dataObj.cFS.data": {
              $map: {
                input: "$dataObj.cFS.data",
                as: "data",
                in: {
                  $mergeObjects: [
                    "$$data",
                    {
                      $first: {
                        $filter: {
                          input: "$cfCoreData",
                          cond: {
                            $eq: [
                              "$$data.cf_id",
                              "$$this.cf_id"
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      ])
      

      Demo @ Mongo Playground

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2019-04-05
      • 1970-01-01
      • 2022-01-19
      • 2020-11-25
      • 1970-01-01
      • 2020-08-15
      • 2019-09-30
      • 2021-12-23
      相关资源
      最近更新 更多