【问题标题】:Group By Condition in MongoDB在 MongoDB 中按条件分组
【发布时间】:2014-07-31 22:52:15
【问题描述】:

我在 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


    【解决方案1】:

    聚合框架就是你想要的:

    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" ] }
                ]
            }
        }}
    ])
    

    因此,首先您使用date aggregation operators 在当天进行分组,并获取给定日期的项目总数。此处使用$cond 运算符确定“状态”是否实际上是缺陷,结果是条件$sum,其中仅计算“缺陷”值。

    每天对这些进行分组后,您只需 $divide 得到结果,然后再次检查 $cond 以确保您没有被零除。

    【讨论】:

    • 感谢发帖!有道理,但它不在 MongoDB 控制台中运行。没有错误消息,我正在尝试浏览它是否是语法问题...
    • 你只是复制粘贴吗? “收藏”必须是您收藏的名称。这只是我使用的一个基本名称,除非您实际指定您在问题中尝试过的查询。
    • 是的,我在查询中更改了。
    • @user3689902 缺少方括号。更新
    • 如果我想针对特定的inspector_id(比如ObjectId("5397997a02b8751dc5a5e8b1"))运行此查询,是否只需将其添加为另一个条件?
    【解决方案2】:

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

    $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
                            ]
                        }
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 2023-04-02
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多