Mongodb根据行值

时间:2018-05-07 12:32:34

标签: mongodb aggregation-framework

我有这样的示例数据:

[
  { objectId: 1, user: 1, phones: [1, 2], emails: ['a'] },
  { objectId: 2, user: 1, phones: [1, 5], emails: ['a', 'f'] },
  { objectId: 3, user: 1, phones: [8, 9], emails: ['f', 'g'] },
  { objectId: 4, user: 1, phones: [10], emails: ['h'] },
  { objectId: 5, user: 2, phones: [1, 2, 3], emails: ['aa', 'bb', cc'] },
]

现在我需要在这些条件下将所有相关的行合并为一个:

  • 拥有相同的用户
  • 至少有一部普通电话或电子邮件

所以输出这样的东西:

[
  { objectId: 1, user: 1, phones: [1, 2, 5, 8, 9], emails: ['a', 'f', 'g'] },
  { objectId: 4, user: 1, phones: [10], emails: ['h'] },
  { objectId: 5, user: 2, phones: [1, 2, 3], emails: ['aa', 'bb', cc'] },
]

这是我到目前为止所提出的:

[
  {
    $unwind: {
      path: "$phones",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $group: {
      _id: {
        user: "$user",
        phone: "$phones"
      },
      objectIds: {
        $addToSet: "$_id"
      },
      emailsList: {
        $push: "$emails"
      },
      user: { $first: "$user" },
      phones: {
        $first: "$phones"
      }
    }
  },
  {
    "$addFields": {
      "emails": {
        "$reduce": {
          "input": "$emailsList",
          "initialValue": [],
          "in": { "$setUnion": ["$$value", "$$this"] }
        }
      }
    }
  },

  {
    "$project": {
      "emailsList": 0
    }
  },
  {
    $unwind: {
      path: "$emails",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $group: {
      _id: {
        user: "$user",
        phone: "$emails"
      },
      objectIdsList: {
        $push: "$objectIds"
      }
    }
  },
  {
    "$project": {
      "mergedObjectIds": {
        "$reduce": {
          "input": "$objectIdsList",
          "initialValue": [],
          "in": { "$setUnion": ["$$value", "$$this"] }
        }
      }
    }
  }
]

然后我们有一个需要合并的objectIds列表,然后我将它们全部合并到应用程序代码中。那么无论如何我只能在聚合框架中做到这一点,或者将这个聚合的结果传递给下一个

0 个答案:

没有答案