MongoDB 中按条件分组

问题描述 投票:0回答:2

我在 MongoDB 中有一系列文档(检查事件),如下所示:

{
    "_id" : ObjectId("5397a78ab87523acb46f56"),
    "inspector_id" : ObjectId("5397997a02b8751dc5a5e8b1"),
    "status" : 'defect',
    "utc_timestamp" : ISODate("2014-06-11T00:49:14.109Z")
}

{
    "_id" : ObjectId("5397a78ab87523acb46f57"),
    "inspector_id" : ObjectId("5397997a02b8751dc5a5e8b2"),
    "status" : 'ok',
    "utc_timestamp" : ISODate("2014-06-11T00:49:14.109Z")
}

我需要获得如下所示的结果集:

[
  {
    "date" : "2014-06-11",
    "defect_rate" : '.92' 
  },  
  {
    "date" : "2014-06-11",
    "defect_rate" : '.84' 
  }, 
]

换句话说,我需要得到每天的平均缺陷率。这可能吗?

mongodb mongodb-query aggregation-framework
2个回答
38
投票

聚合框架就是你想要的:

db.collection.aggregate([
    { "$group": {
        "_id": {
            "year": { "$year": "$utc_timestamp" },
            "month": { "$month": "$utc_timestamp" },
            "day": { "$dayOfMonth": "$utc_timestamp" },
        },
        "defects": {
            "$sum": { "$cond": [
                { "$eq": [ "$status", "defect" ] },
                1,
                0
            ]}
        },
        "totalCount": { "$sum": 1 }
    }},
    { "$project": {
        "defect_rate": {
            "$cond": [
                { "$eq": [ "$defects", 0 ] },
                0,
                { "$divide": [ "$defects", "$totalCount" ] }
            ]
        }
    }}
])

因此,首先使用日期聚合运算符对当天进行分组,并获取给定日期的项目总数。这里使用

$cond
运算符确定“状态”是否实际上是缺陷,并且结果是条件
$sum
,其中仅计算“缺陷”值。

一旦每天对它们进行分组,您只需

$divide
结果,再用
$cond
检查以确保您没有除以零。


4
投票

这是否是更新问题的最佳方法?

  $group: {
    _id: "$symbol",
    amount: { $sum: "$amount" },
    value: { $sum: "$value" },
    occurences: { $sum: 1 },
    in: {
      $sum: {
        $cond: [{ $eq: ["$direction", "IN"] }, 1, 0],
      },
    },
    out: {
      $sum: {
        $cond: [{ $eq: ["$direction", "OUT"] }, 1, 0],
      },
    },
  }
© www.soinside.com 2019 - 2024. All rights reserved.