微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

单个MongoDB聚合管道中具有条件的总计数和字段计数

如何解决单个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"]
      }
    }
  }
])

Playground

,

正如我发现的那样,您不能在一个管道中完成此操作,那么您必须按照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 举报,一经查实,本站将立刻删除。