如何在Mongo聚合中进行多次匹配

时间:2020-10-03 01:43:38

标签: mongodb aggregation-framework

我有Submission个文档的集合。 每个Submission都有一个bookingId,一个提交状态和一个指示器,指示状态为SUCCESS时是否发送了一个事件

我正在尝试创建一个聚合,该聚合返回唯一的BookingIds列表。如果该bookingId的所有提交都具有状态SUCCESS

,则此列表应包含一个bookingId。

下面有示例Submission文档的集合:

{
    "_id" : ObjectId("5f7349ebc783305b9331a4b0"),
    "bookingId" : "NW111",
    "status" : "SUCCESS",
    "sent" : false
},
{
    "_id" : ObjectId("5f7349ebc783305b9331a4b1"),
    "bookingId" : "NW111",
    "status" : "SUCCESS",
    "sent" : false
},
{
    "_id" : ObjectId("5f7349ebc783305b9331a4b2"),
    "bookingId" : "NW115",
    "status" : "READY",
    "sent" : false
},
{
    "_id" : ObjectId("5f7349ebc783305b9331a4b3"),
    "bookingId" : "NW115",
    "status" : "PROCESSING",
    "sent" : false
},
{
    "_id" : ObjectId("5f7349ebc783305b9331a4b4"),
    "bookingId" : "NW115",
    "status" : "ERROR",
    "sent" : false
}

上面示例的预期结果应该是

{
    "bookingIds" : ["NW111"]
}

到目前为止,我有以下内容:

db.submissions.aggregate(
    [ { $match : { sent : false } } ]
);

1 个答案:

答案 0 :(得分:0)

您可以尝试

  • $group的{​​{1}},并在状态为SUCCESS或其他条件为false时在bookingId中设置true
  • status条件状态不等于false
  • $match设为null,并制作$group的数组
bookingIds

Playground


第二种方式,如果您知道状态列表,则可以尝试,这样我们就可以排除第一组中的db.submissions.aggregate([ { $group: { _id: "$bookingId", status: { $addToSet: { $cond: [{ $eq: ["$status", "SUCCESS"] }, true, false] } } } }, { $match: { status: { $ne: false } } }, { $group: { _id: null, bookingIds: { $push: "$_id" } } } ])

  • $cond by $group,并建立唯一的状态数组
  • bookingId状态不在提供的状态数组中
  • $match设为null,并制作$group的数组
bookingIds

Playground