【问题标题】:MongoDB Group By _id's TimestampMongoDB按_id的时间戳分组
【发布时间】:2014-07-20 21:53:35
【问题描述】:

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

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

类似的东西

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

谢谢

【问题讨论】:

    标签: javascript mongodb mapreduce timestamp aggregation-framework


    【解决方案1】:

    您在这里所指的函数是一个 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 } }
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2014-07-08
      • 2013-01-24
      • 2018-09-04
      • 2011-10-13
      • 2014-05-31
      相关资源
      最近更新 更多