javascript - MongoDB 按 _id 的时间戳分组

标签 javascript mongodb mapreduce timestamp aggregation-framework

我希望按创建日期对一堆文档进行分组。

使用 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/

相关文章:

javascript - 如何创建多个高度为 100% 的 div?

java - Mongo插入带有嵌套数组元素的json文档

c - valgrind - 使用 C api 连接到 mongodb 而不会导致 SIGSEGV

mongodb - Mongo查询子文档并打印一行

hadoop - Mapreduce 失败日志 Hadoop

hadoop - 将文件从本地文件复制到hdfs时出现错误消息

javascript - 如何在不和谐机器人上发出命令来随机生成报价?

javascript - 返回一个对象 - javaScript

javascript - 使用 php 或 JS 将 HEIC 转换为 JPG

hadoop - yarn hadoop 2.4.0 : info message: ipc. 客户端重试连接到服务器