MongoDB Group By _id的时间戳

时间:2014-07-20 21:53:35

标签: javascript mongodb mapreduce timestamp aggregation-framework

我希望按照创建日期对大量文档进行分组。

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

类似的东西

db.sessions.aggregate(
    { $group : 
        {_id: { $dayOfYear: "$_id.getTimestamp()"},
        count: { $sum: 1 }
    }
})

由于

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