MongoDB时间戳字段采样和聚合

时间:2014-06-04 12:17:56

标签: mongodb mapreduce aggregation-framework

我是MongoDB的新手,所以请耐心等待。

考虑一个以下列形式的文档构建的集合:

{
    "_id" : ObjectId("538d87a36da0bab7ff1a827d"),
    "resource_id", "some_id",
    "server_ts" : 1401784227674.05214213,
    "location" : [ 
        34.8383953, 
        32.1098175
    ],
    "__v" : 0
}

每个资源都以相对较快的速度添加文档,因此我最终得到基于server_ts的高分辨率时间戳位置(大约半秒分辨率)。 我希望能够根据资源ID查询集合,但以较低的分辨率(例如5秒分辨率,而不是原始的0.5)返回文档。 换句话说,我想将时间分成5秒的范围,并且对于每个范围,获取一个落在该范围内的文档(如果它实际存在)。 在聚合框架或标准查询界面中是否有一种方便的方法可以根据此标准“采样”数据?

显然这可以在服务器端代码(在我的情况下是Node.js)中完成,但我仍然想知道是否有更好的替代方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果将时间戳存储为整数,则可以使用modulo运算符。     db.coll.find({ts:{$ mod:[5,0}}})

这将返回ts的值为例如的所有文档。 1401784227670,1401784227675,1401784227680 ......

当然,只有在同一秒内只有一个文档时,这才有效。

要过滤掉“重复”,您可以使用以下聚合:

db.x.aggregate([
    { $match : { ts : { $mod : [ 5, 0] } } },
    { $sort : { ts : 1 } }, /* without it $first is unpredictable */
    { $group : { _id : "$ts", location : { $first : "$location" } /* etc. */ } } 
]);