Mongodb聚合不按日期对文档进行分组

时间:2014-12-14 22:26:49

标签: mongodb mongodb-query aggregation-framework

我的MongoDB中有以下3个文档:

[Object_id: "tMSfNq9JR85XDaQe5"date: Sun Dec 07 2014 19:50:21 GMT+0800 (HKT)description: "Test" projectid: "S83NEGHnrefvfASrf"totalseconds: 22200__proto__: Object, 

Object_id: "FeyzdMosaXCht8DKK"date: Mon Dec 15 2014 00:00:00 GMT+0800 (HKT)description: "444"projectid: "S83NEGHnrefvfASrf"totalseconds: 3660__proto__: Object, 

Object_id: "cCKByxSdQMHAsRKwd"date: Mon Dec 15 2014 00:00:00 GMT+0800 (HKT)description: "555"projectid: "S83NEGHnrefvfASrf"totalseconds: 3660__proto__: Object]

我正在尝试在其上运行以下聚合管道,将totalseconds的总和分组为date,以便最终结果如下所示,但每次我得到结果为3记录完全正如输入3文件...有人可以告诉我我可能做错了什么/在这里失踪?感谢

var pipeline = [
  {$group:
        {_id:{"projectId":"$projectid", "date":"$date"},
         totalHrs:{$sum:"$totalseconds"}
        }
  }
];


 { "Date":"Sun Dec 07 2014 19:50:21 GMT+0800 (HKT)",
   "totalseconds": "22200"
 },
 { "Date":"Sun Dec 15 2014 00:00:00 GMT+0800 (HKT)",
   "totalseconds": "7320"
 }

1 个答案:

答案 0 :(得分:1)

您在这里提供的只是现有的"日期"值作为分组键的一部分。它正是它所说的并且可能非常精细,即毫秒。

你想要的只是使用" day"日期类型字段中记录的时间戳值的一部分。为此,您可以使用聚合框架的date operators

db.collection.aggregate([
    { "$group": {
        "_id": { 
            "projectid": "$projectid",
            "day": { "$dayOfMonth": "$date" },
            "month": { "$month": "$date" },
            "year": { "$year": "$date" }
        },
        "totalseconds": { "$sum": "$totalseconds" }
    }}
])

或者只是在日期对象上使用日期数学并将值四舍五入到一天:

db.collection.aggregate([
    { "$group": {
        "_id": { 
            "projectid": "$projectid",
            "date": {
                "$subtract": [
                    { "$subtract": [ "$date", new Date("1970-01-01") ]},
                    { "$mod": [
                        { "$subtract": [ "$date", new Date("1970-01-01") ]},
                        1000 * 60 * 60 * 24
                    ]}
                ]
            }
        },
        "totalseconds": { "$sum": "$totalseconds" }
    }}
])

无论哪种方式,您只想要部分日期字段而不是全部。否则,除非确切的时间值相同,否则没有任何实际分组。