我遇到一些问题,使我的MongoDB查询更有效率。我的文件格式如下:
{
_id: UUID,
p: 'some.path',
t: 'Fri Dec 12 2014 09:26:18 GMT+0100 (CET)',
v: 123.4
}
其中索引路径和时间戳。该路径是我们系统中的标识符,我们有大约15-16000个不同的路径。我们的日志记录应用程序每秒将这些值记录在大约3000个文档中,并且运行正常而没有问题。
我的问题是及时检索"快照"这些价值观;我想在给定时间进行查询以了解所有信号是什么。这意味着对于每个路径,获取时间戳小于或等于请求的时间戳的最新值,并返回所有这些文档。
所以在SQL /伪代码中:
results = []
for each distinct path:
find document where p == path and t <= timestamp, order by t desc, limit 1
results.push(result)
通过使用带匹配,排序和分组的聚合,我也获得了相同的结果:
aggregate(
[
{ $match: { t : { $lte: timestamp}} },
{ $sort: { t : -1 } },
{ $group:
{
_id: { x: "$p"},
p: { $last: "$p"},
t: { $last: "$t"},
v: { $last: "$v"}
}
}
]
然而,由于我的收藏目前大约有2.5亿条记录,所以这两种方法都很慢。我真的坚持这个,似乎无法让它发挥作用。如果我找不到这个问题的解决方案,我可能不得不开始寻找可能更好地支持这些类型查询的其他数据库。