我有一个数据库查询,它选择所有时间戳字段(tmp)落在某个范围内的文档,如下所示
{ tmp: { '$gte': 1411929000000, '$lte': 1419010200000 } }
此查询返回大量记录,例如10000.
目标: 要获取相同间隔范围中的文档,,但在之间用say(1小时时间戳)间隔分隔,从而减少了提取的记录数。
有没有办法完全使用MongoDB查询系统?
由于NDA我无法显示代码,但它基本上包含证券交易所数据(比如1分钟间隔)。目标是在两个端点(时间)之间发送这些数据的样本。但事实是,客户可以要求5分钟间隔数据或10分钟或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手册中的以下两个架构设计文章: