【问题标题】:Mongodb count distinct with multiple group fieldsMongodb计数与多个组字段不同
【发布时间】:2014-07-02 05:48:21
【问题描述】:

我有一个事务表,其中填充了员工的假期。 我需要有关 mongodb 中以下 sql 场景的帮助。

select employee,month,year,count(distinct (holiday_type) from 
transactions group by employee,month,year

我需要在 mongodb 中使用聚合,并且像这样创建了 mongo 查询,这给了我错误的解决方案

db.transactions.aggregate([
    { "$group": { 
        "_id": { 
            "Month": { "$month" : "$date" }, 
            "Year": { "$year" : "$date" },
            "employee" : "$employee",
            "holiday_type" : "$holiday_type"
        },
        "Count_of_Transactions" : { "$sum" : 1 }
     }}
 ]);

我对在 mongodb 中使用计数不同的逻辑感到困惑。任何建议都会有所帮助

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    其中的一部分,但您需要先获取“holiday_type”的“不同”值,然后再$group

    db.transactions.aggregate([
        { "$group": { 
            "_id": { 
                "employee" : "$employee",
                "Month": { "$month" : "$date" }, 
                "Year": { "$year" : "$date" },
                "holiday_type" : "$holiday_type"
            },
         }},
         { "$group": {
             "_id": {
                "employee" : "$_id.employee",
                "Month": "$_id.Month",
                "Year": "$_id.Year"
             },
             "count": { "$sum": 1 }
         }}
     ], { "allowDiskUse": true }
     );
    

    这是一般过程,因为 SQL 中的“distinct”本身就是一种分组操作。所以这是一个双重$group 操作,以获得正确的结果。

    【讨论】:

    • 执行此查询时出现如下错误断言:命令失败:{“errmsg”:“异常:超过 $group 的内存限制,但不允许外部排序。通过 allowDiskUse :true 选择加入。", "code" : 16945, "ok" : 0 } : 聚合失败
    • @Karthi $group 操作的内存使用限制在 MongoDB 2.6 中减少了,但您也可能有一个特别大的集合。正如我在编辑中包含的那样,您可以在方法参数的“选项”部分添加“allowDiskUse”来对抗它。另请参阅aggregate 命令手册页
    • 你是对的。我没有在查询中包含allowDiskuse。这很有帮助。
    • 如果我想做一个求和函数,例如说小时,哪个组段应该有求和函数说 (total : $sum : $hours") 这需要跨月、年分组,员工。
    • @Karthi 这听起来像是另一个问题,可能比简短的评论更好地表达为一个问题。请随时询问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多