【发布时间】:2022-01-20 15:04:21
【问题描述】:
鉴于我有一个复杂的分组要求,我想知道实现我想要的结果的最佳方法是什么。 我的数据($project 阶段的结果)看起来像这样:
{
_id:$id
status:"available"
inspectionStatus:"done"
state:"completed"
category:"One"
},
{
_id:$id
status:"booked"
inspectionStatus:"none"
state:"active"
category:"Two"
},
.
.
.
我尝试使用$facet 创建多个存储桶,因为我尝试创建的分组是$status + $state + $inspection 的聚合,但是执行时间是不可接受的,占用了@987654326 @ 毫秒。
我不能使用 $accumulator 因为 mongoDB 版本(虽然我们总是可以升级到 4.4.x),但我不确定使用 $accumulator 是否会产生更好的响应时间。
包含$facet 阶段:
{
"available": [
{"$match":
{$and: [
{"status": "available"},
{"inspectionStatus": "done"}
]}
}
],
"matched": [
{"$match":
{$and: [
{"status": "booked"},
{"state": "booked"}
]
}
}
],
"inIntake": [
{"$match":
{$and: [
{"status": "available"},
{"inspectionStatus": {$ne: "done"}}
]
}
}
],
"active": [
{"$match":
{$and: [
{"status": "booked"},
{"state": "active"}
]
}
}
],
"unreturned":[
{"$match":
{"status": "forceCompleted"}
}
]
}
【问题讨论】:
-
你是说你想
{$group: {_id: {status:"$status",state:"$state",inspection:"$inspection}, n: {$sum:1} }}吗?这将计算状态/状态/检查的所有组合。 -
不是真的...我不需要所有组合,我需要组合的子集
unreturned、active、inIntake、active和available -
我怀疑你在这里不需要
$facet,因为你没有使用引擎对任何东西进行分组,只是过滤。如果子集在总集合大小中占很大比例,甚至不要使用$match:只需执行`简单的find()并使用客户端逻辑选择unreturned、active等。如果没有,请使用单个$match和一个大的$or表达式来处理上述方面 - 您仍然必须使用客户端逻辑来分离结果。 -
另外:我们在这里讨论了多少文档? 1639763842 毫秒几乎是 19 天。
-
抱歉复制了错误的值。应该说
11333mils。对于79188记录。
标签: mongodb sum aggregation