mongodb - 如何将两个单独的 Mongo 聚合组合成一个聚合?
问题描述
我有两个聚合查询,我想将它们组合成一个聚合查询。我想知道如何实现这一目标。
两个查询都在谈论一个名为的集合,该集合Submission
主要是关于status
. 以下是两个聚合查询:
聚合 1:按预订 ID 分组的提交都具有状态 SUCCESS
聚合 2:按预订 ID 分组的提交至少有一个状态为 ERROR
理想情况下,我想要的是以下结果:
{
"_id": null,
"successBookingIds": [
"NW111"
],
"errorBookingIds": [
"NW115"
]
}
我怎样才能以最好的方式实现这一目标?考虑到性能。
解决方案
您可以使用$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"
}
}
}
])
推荐阅读
- node-red - Node-RED 中的模板 UI 和变量
- javascript - 在 div 中显示搜索关键字并在页面加载时显示该 div
- game-maker-language - 坠落平台游戏制作工作室 2
- javascript - 下载文件并将其通过管道传输到另一个上传 url 到不同的 API
- gcc - 如何找出内核编译的内核文件列表?
- javascript - 音频无法在移动 chrome 上播放
- ruby - “nil:NilClass 的未定义方法‘+’”
- c# - 在不阅读内容的情况下丢弃 HttpResponseMessage 是否安全?
- java - 没有明显冗余的类型转换,Java 无法正确推断流类型
- python - 定时器每 5 分钟运行一次(0、5、10、15 等) 24/7 不间断