我有Submission
个文档的集合。
每个Submission
都有一个bookingId
,一个提交状态和一个指示器,指示状态为SUCCESS
时是否发送了一个事件
我正在尝试创建一个聚合,该聚合返回唯一的BookingIds列表。如果该bookingId的所有提交都具有状态SUCCESS
下面有示例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 } } ]
);
答案 0 :(得分:0)
您可以尝试
$group
的{{1}},并在状态为SUCCESS或其他条件为false时在bookingId
中设置true status
条件状态不等于false $match
设为null,并制作$group
的数组bookingIds
第二种方式,如果您知道状态列表,则可以尝试,这样我们就可以排除第一组中的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