MongoDB查询在非常大的集合上运行缓慢-基于字段检索不同的文档

MongoDB查询在非常大的集合上运行缓慢-基于字段检索不同的文档,mongodb,mongodb-query,Mongodb,Mongodb Query,我在提高MongoDB查询的效率方面遇到了一些问题。我的文件的格式如下: { _id: UUID, p: 'some.path', t: 'Fri Dec 12 2014 09:26:18 GMT+0100 (CET)', v: 123.4 } 其中路径和时间戳被索引。路径是我们系统中的一个标识符,我们有大约15-16000条不同的路径。我们的日志应用程序以每秒3000个文档的速度记录这些值,运行良好,没有问题 我的问题是在检索这些值的“及时快照”时;我想查询一下,在给定的时间

我在提高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)

然而,由于我的收藏目前大约有2.5亿条记录,这两种方法都非常缓慢。我真的被这件事缠住了,似乎无法让它发挥作用。如果我找不到这个问题的解决方案,我可能必须开始寻找其他可能更好地支持这些查询类型的数据库。

您显示的日期对象看起来不像mongo内置类型。除此之外,我认为你应该限制两边的$math子句必须分组在一个较小的样本上(如果查询仍然提供了正确的答案),谢谢你的反馈,@fricke。你是对的,日期格式不对,我只是从终端复制了一些东西到问题中作为说明,这不是问题所在。正如您所建议的,我已经尝试将$match子句限制在请求的时间戳前一小时,查询速度更快,但仍然需要大约20秒才能完成;优化groupBy并不容易,而且很难避免对数据集(与match子句匹配的数据集)进行全面扫描-哦,你能帮我一个忙吗?投票支持我的评论我认为聚合管道是当前文档结构可用的最佳方法。您对绩效的期望是什么?查询的速度应该有多快?
aggregate(
[
    { $match: { t : { $lte: timestamp}} },
    { $sort: { t : -1 } },
    { $group:
    {
    _id: { x: "$p"},
    p: { $last: "$p"},
    t: { $last: "$t"},
    v: { $last: "$v"}
    }
    }
]