单个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的基础上$cond(条件)如果inspectionIsFailedIDTrue则返回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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章