Javascript MongoDB Group By#u 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助手实现的。不同语言的其他驱动程序实

我想按创建日期对一堆文档进行分组

使用MongoDB聚合框架,是否可以根据_id的时间戳对文档进行分组

类似的

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}
)