如何解决单个MongoDB聚合管道中具有条件的总计数和字段计数
我有一些组件。简化后,文档如下所示:
{
"_id" : "50c4f4f2-68b5-4153-80db-de8fcf716902","name" : "C156","posX" : "-136350","posY" : "-27350","posZ" : "962","inspectionIsFailed" : "False"
}
我现在要计算三件事。集合中所有组件的数量,所有故障组件的数量"inspectionIsFailed": "True"
,然后是比率(所有故障组件的数量除以所有组件的数量)。
我知道如何分别获取前两件事,并分别获取一个集合。
所有组件的数量:
db.components.aggregate([
{$group: {_id: null,totalCount: {$sum: 1}}}
]);
所有故障组件的数量:
db.components.aggregate([
{$match: {inspectionIsFailed: "True"}},{$group: {_id: null,FailedCount: {$sum: 1}}}
]);
但是,我想在一个管道中而不是分别计算两个值。然后,我可以使用$ divide在管道末端计算比率。我想要的输出应该只包含比率:
{ ratio: 0.2 }
单个管道的问题是:
如果我首先尝试计算总数,那么我将无法再计算故障组件的数量。如果我先用$ match计算有故障的组件数,我将无法再计算总数。
解决方法
您可以尝试
-
$group
为空,用totalCount
得到$sum
,如果failedCount
id为$cond
(条件),则得到inspectionIsFailed
True
然后返回1并以其他方式求和0 -
$project
使用$divide
获取比率
db.collection.aggregate([
{
$group: {
_id: null,totalCount: { $sum: 1 },failedCount: {
$sum: {
$cond: [{ $eq: ["$inspectionIsFailed","True"] },1,0 ]
}
}
}
},{
$project: {
_id: 0,ratio: {
$divide: ["$failedCount","$totalCount"]
}
}
}
])
,
正如我发现的那样,您不能在一个管道中完成此操作,那么您必须按照this answer所述使用$facet
。
我还建议对inspectionIsFailed
使用布尔值。
db.collection.aggregate([
{
$facet: {
totalCount: [
{
$count: "value"
}
],pipelineResults: [
{
$match: {
inspectionIsFailed: true
}
},{
$group: {
_id: "$_id",failedCount: {
$sum: 1
}
}
}
]
}
}
])
您可以here对其进行测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。