我的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"
}
答案 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" }
}}
])
无论哪种方式,您只想要部分日期字段而不是全部。否则,除非确切的时间值相同,否则没有任何实际分组。