我希望按创建日期对一堆文档进行分组。
使用 MongoDB 聚合框架,是否可以按 _id 的时间戳对文档进行分组?
类似的东西
db.sessions.aggregate(
{ $group :
{_id: { $dayOfYear: "$_id.getTimestamp()"},
count: { $sum: 1 }
}
})
谢谢
最佳答案
您在此处引用的函数是作为 ObjectId 包装器的 shell 助手实现的 JavaScript 方法。其他各种语言的驱动实现都包含类似的方法,其基本功能可以从 mongo shell 中看到,如下所示:
function (){
return new Date(parseInt(this.valueOf().slice(0,8), 16)*1000);
}
但这至少在 shell 上下文中是 JavaScript,并且您不能在聚合框架内使用 JavaScript 方法,只允许实现的运算符。目前聚合框架方法中没有“帮助程序”来从 ObjectId 中提取“时间戳”。
此外,聚合框架目前还缺少实现此功能所需的功能(如上例所示)。您不可能将 ObjectId“转换”为字符串,更不用说将字符串转换为整数或从基本类型转换。
对于聚合框架,最好的设计方法是在文档中包含所需的日期值并进行相应更新。
如果您确实不想这样做并且必须从 ObjectId 值中提取日期,那么您需要将 JavaScript 评估与 mapReduce 结合使用,或者以其他方式传输到客户端代码:
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 } }
)
关于javascript - MongoDB 按 _id 的时间戳分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855270/