Javascript MongoDB Group By#u id';时间戳
我想按创建日期对一堆文档进行分组 使用MongoDB聚合框架,是否可以根据_id的时间戳对文档进行分组 类似的Javascript MongoDB Group By#u id';时间戳,javascript,mongodb,mapreduce,timestamp,aggregation-framework,Javascript,Mongodb,Mapreduce,Timestamp,Aggregation Framework,我想按创建日期对一堆文档进行分组 使用MongoDB聚合框架,是否可以根据_id的时间戳对文档进行分组 类似的 db.sessions.aggregate( { $group : {_id: { $dayOfYear: "$_id.getTimestamp()"}, count: { $sum: 1 } } }) 谢谢您在这里提到的函数是一个JavaScript方法,它是作为ObjectId包装器的shell助手实现的。不同语言的其他驱动程序实
db.sessions.aggregate(
{ $group :
{_id: { $dayOfYear: "$_id.getTimestamp()"},
count: { $sum: 1 }
}
})
谢谢您在这里提到的函数是一个JavaScript方法,它是作为ObjectId包装器的shell助手实现的。不同语言的其他驱动程序实现包含类似的方法,其基本功能可以从mongo shell中看到,如下所示:
函数(){
返回新日期(parseInt(this.valueOf().slice(0,8),16)*1000);
}
但这至少在shell上下文中是JavaScript,您不能在聚合框架中使用JavaScript方法,只允许实现的操作符。目前,在聚合框架方法中没有从ObjectId提取“时间戳”的“助手”
同样,目前聚合框架中缺少上面示例中所示的实现此功能所需的功能。您不可能将ObjectId“强制转换”为字符串,更不用说将字符串强制转换为整数或从基类型转换
对于聚合框架,最好的设计方法是在文档中包含所需的日期值,并进行相应的更新
如果您确实不希望这样做,并且必须从ObjectId值中提取日期,那么您需要使用mapReduce的JavaScript求值,或者转换到客户端代码:
db.collection.mapReduce(
函数(){
//每天获取时间组
var id=this.\u id.getTimestamp()
-(此._id.getTimestamp()%(1000*60*60*24));
删除此项。\u id;
发射(id,this);
},
功能(键、值){
//一些减少操作
},
{“out”:{“inline”:1}
)