【问题标题】:MongoDB timestamp field sampling and aggregationMongoDB时间戳字段采样和聚合
【发布时间】:2014-06-04 12:17:56
【问题描述】:

我对 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 秒的范围,并且对于每个范围,获取一个属于该范围的文档(如果它确实存在)。 在聚合框架或标准查询接口中,mongodb 中是否有一种方便的方法可以根据此标准“采样”数据?

显然这可以在服务器端代码中完成(在我的例子中是 Node.js),但我仍然想知道是否有更好的选择。

谢谢!

【问题讨论】:

    标签: mongodb mapreduce aggregation-framework


    【解决方案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. */ } } 
    ]);
    

    【讨论】:

    • $first 正是我想要的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多