我在mongo集合中有这个数据时间:
{
...
"CreationDateTime" : ISODate("2017-03-06T08:16:02.930Z"),
...
},
....
{
...
"CreationDateTime" : ISODate("2018-03-06T08:16:04.030Z"),
...
},...
我想按小时对我的收藏品进行分组。意思是我想那些文件在8点钟来到同一组并且那些文件在9点钟来到同一组。因为我想在同一组中选择第一个文档。有人用它的累加器运算符对这个分组有任何逻辑或想法吗?
答案 0 :(得分:1)
如果您只想要特定小时,那么您可以在聚合框架中使用$hour,如下所示:
db.col.aggregate([
{
$group: {
_id: { $hour: "$CreationDateTime" },
docs: { $push: "$$ROOT" }
}
}
])
MongoDB会将8
设置为您的文档的分组_id
。否则,如果您需要一个小时作为间隔,则必须使用$dayOfMonth
,$month
和$years
,如下所示
db.col.aggregate([
{
$group: {
_id: {
h: { $hour: "$CreationDateTime" },
d: { $dayOfMonth: "$CreationDateTime" } ,
m: { $month: "$CreationDateTime" } ,
y: { $year: "$CreationDateTime" } ,
},
docs: { $push: "$$ROOT" },
firstDoc: { $first: "$$ROOT" }
}
}
])
在这种情况下,您将{ "h" : 8, "d" : 6, "m" : 3, "y" : 2017 }
作为分组_id
答案 1 :(得分:0)
你可以像mapReduce实用程序那样
db.collection.mapReduce(function(){
var hour = this.CreationDateTime.getHour()
emit(this.hour,this)
},function(key,values){
return JSON.stringify(values);
},{out:{inline:true}});
答案 2 :(得分:0)
这是汇总框架解决方案
db.collection.aggregate(
[
{
$group:
{
_id: "$CreationDateTime",
items: { $push: { field1: "$field1", field2: "$field1" } }
}
}
]
)