我有一些组件。简化后,文档如下所示:
{
"_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
的基础上$cond
(条件)如果inspectionIsFailed
IDTrue
则返回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"]
}
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句