我希望按照创建日期对大量文档进行分组。
使用MongoDB聚合框架,是否可以按_id的时间戳对文档进行分组?
类似的东西
db.sessions.aggregate(
{ $group :
{_id: { $dayOfYear: "$_id.getTimestamp()"},
count: { $sum: 1 }
}
})
由于
答案 0 :(得分:2)
您在这里引用的函数是一个JavaScript方法,它实现为ObjectId包装器的shell帮助程序。各种语言的其他驱动程序实现包含一个类似的方法,其基本功能可以从mongo shell中看到:
function (){
return new Date(parseInt(this.valueOf().slice(0,8), 16)*1000);
}
但至少在shell上下文中这是JavaScript,你不能在聚合框架中使用JavaScript方法,只允许实现的运算符。聚合框架方法中目前没有“帮助器”从ObjectId中提取“时间戳”。
同样,目前聚合框架缺乏实现此目的示例所示的所需功能。您不可能将ObjectId“转换”为字符串,更不用说将字符串转换为整数或从基类型转换。
对于聚合框架,最佳设计方法是在文档中包含所需的日期值并相应地更新。
如果你真的希望不这样做并且必须从ObjectId值中提取日期,那么你需要使用mapReduce的JavaScript评估,或者转移到客户端代码:
db.collection.mapReduce(
function() {
// Get time group per day
var id = this._id.getTimestamp()
- ( this._id.getTimestamp() % ( 1000 * 60 * 60 * 24 ) );
delete this._id;
emit( id, this );
},
function(key,values) {
// some reduce operation
},
{ "out": { "inline": 1 } }
)