首页 > 解决方案 > 如何将两个单独的 Mongo 聚合组合成一个聚合?

问题描述

我有两个聚合查询,我想将它们组合成一个聚合查询。我想知道如何实现这一目标。

两个查询都在谈论一个名为的集合,该集合Submission主要是关于status. 以下是两个聚合查询:

聚合 1:按预订 ID 分组的提交都具有状态 SUCCESS

聚合 2:按预订 ID 分组的提交至少有一个状态为 ERROR

理想情况下,我想要的是以下结果:

{
    "_id": null,
    "successBookingIds": [
      "NW111"
    ],
    "errorBookingIds": [
      "NW115"
    ]
}

我怎样才能以最好的方式实现这一目标?考虑到性能。

标签: mongodbaggregation-framework

解决方案


您可以使用$facet阶段实现此用例

db.collection.aggregate([
  {
    $match: {
      sent: false
    }
  },
  {
    $group: {
      _id: "$bookingId",
      status: {
        $addToSet: "$status"
      }
    }
  },
  {
    $facet: {
      success: [
        {
          $match: {
            status: {
              $nin: [
                "ERROR"
              ]
            }
          }
        },
        {
          $match: {
            status: {
              $in: [
                "SUCCESS"
              ]
            }
          }
        },
        {
          $project: {
            success: "$_id",
            _id: 0
          }
        }
      ],
      error: [
        {
          $match: {
            status: {
              $in: [
                "ERROR"
              ]
            }
          }
        },
        {
          $project: {
            error: "$_id",
            _id: 0
          }
        }
      ]
    }
  },
  {
    $project: {
      concat: {
        "$concatArrays": [
          "$error",
          "$success"
        ]
      }
    }
  },
  {
    $unwind: "$concat"
  },
  {
    $group: {
      _id: null,
      successBookingIds: {
        $push: "$concat.success"
      },
      errorBookingIds: {
        $push: "$concat.error"
      }
    }
  }
])

请参阅 MongoDB Playground 中的工作查询


推荐阅读