将多个文档合并为一个文档,其中包含 MongoDB 中的两个文档字段

时间:2021-01-18 16:58:00

标签: arrays mongodb mongoose mongodb-query aggregation-framework

我在 MobgoDB 中有多个文档 如何对“abc”和“xyz”上的组进行操作并获取一个文档。请参阅“输出文件”。 需要与 (Document 1 U Document 2) 和 (Document 1 U Document 3) 进行联合。 U=联合

文档 1

{
    "data": {
      "Inside_data": {
        "project": {
          "abc": {
            "alpha": 4,
            "beta" : 45
          },
          "xyz": {
            "alpha": 214,
            "beta" : 431
          }
        }
      }
    }
}

文档 2

    "Deal": {
         "name": "abc",
         "url" : "www.abc.com,
         "email": [ "abc@gmail.com"],
         "total": 2
    }

文档 3

    "Deal": {
         "name": "xyz",
         "url" : "www.googl.com,
          "email": [ "xyz@gmail.com"],
          "total": 25
    }

预期产出。

{
{
         "name": "abc",
         "url" : "www.abc.com,
          "email": "abc@gmail.com",
          "total": 2,
          "alpha": 4,
          "beta" : 45

    },
{
         "name": "xyz",
         "url" : "www.googl.com,
          "email": "xyz@gmail.com",
          "total": 25,
          "alpha": 214,
          "beta" : 431

    }
}

1 个答案:

答案 0 :(得分:0)

db.collection.aggregate([
  {
    $match: {
      Deal: {
        $exists: true
      }
    }
  },
  {
    $lookup: {
      from: "collection",
      let: {
        name: "$Deal.name"
      },
      pipeline: [
        {
          $match: {
            data: {
              $exists: true
            }
          }
        },
        {
          $project: {
            data: {
              $reduce: {
                input: {
                  $objectToArray: "$data.Inside_data.project"
                },
                initialValue: {},
                in: {
                  $cond: [
                    {
                      $eq: [
                        "$$this.k",
                        "$$name"
                      ]
                    },
                    "$$this.v",
                    "$$value"
                  ]
                }
              }
            }
          }
        },
        {
          $project: {
            _id: 0,
            alpha: "$data.alpha",
            beta: "$data.beta"
          }
        }
      ],
      as: "Deal.data"
    }
  },
  {
    $unwind: "$Deal.data"
  }
])

@turivishal 的回答