MongoDB过滤间隔内的数据点

时间:2014-12-24 07:06:26

标签: node.js mongodb

我有一个数据库查询,它选择所有时间戳字段(tmp)落在某个范围内的文档,如下所示

{ tmp: { '$gte': 1411929000000, '$lte': 1419010200000 } }

此查询返回大量记录,例如10000.

目标: 要获取相同间隔范围中的文档,,但在之间用say(1小时时间戳)间隔分隔,从而减少了提取的记录数。

有没有办法完全使用MongoDB查询系统?

由于NDA我无法显示代码,但它基本上包含证券交易所数据(比如1分钟间隔)。目标是在两个端点(时间)之间发送这些数据的样本。但事实是,客户可以要求5分钟间隔数据或10分钟或1小时等,所以从这1分钟间隔数据我需要采样并仅发送相关数据。希望能让它更加清晰。

任何评论都会非常有帮助。感谢。

1 个答案:

答案 0 :(得分:1)

没有办法直接实现你的目标,但你可以做得非常接近。如果时间范围[s, t]和分隔p,您需要在范围内均匀分布大约(t - s) / p个文档,以便缩小"缩小&# 34;感觉数据。选择x,理想情况下与p相比较小,足够大以包含文档但足够小以不包含很多文档,并在宽度x的间隔内查找均匀间隔点的文档按p。您可以使用单个$or查询或一系列查询执行此操作。例如,使用整数而不是日期进行简化,如果我的字段score的值在[0, 50]范围内并希望分辨率为p = 10,我会查看间隔宽度x = 1围绕以10分隔的点:

db.test.find({ "$or" : [
    { "score" : { "$gte" : 0, "$lte" : 1 } },
    { "score" : { "$gte" : 9, "$lte" : 11 } },
    { "score" : { "$gte" : 19, "$lte" : 21 } },
    { "score" : { "$gte" : 29, "$lte" : 31 } },
    { "score" : { "$gte" : 39, "$lte" : 41 } },
    { "score" : { "$gte" : 49, "$lte" : 50 } },
] })

您可以将此分解为6个((t - s) / p + 1)个查询,并在每个查询中限制1个结果,或者。

还有其他一些更高级别的方法可以解决您的问题。我建议查看MongoDB手册中的以下两个架构设计文章: