我有一个有数百万行的mongoDB集合,我试图优化我的查询。我目前正在使用聚合框架来检索数据并按照我的意愿对它们进行分组。我典型的聚合查询是这样的:$match > $group > $ group > $project
但是,我注意到最后的部分只需要几毫秒,开始是最慢的。
我试着只用$ match过滤器执行查询,然后用collection.find执行相同的查询。聚合查询需要大约80ms,而find查询需要0或1ms。
我在几乎每个领域的索引,所以我想这不是问题。有什么想法可能会出错?或者这只是聚合框架的一个“正常”缺陷?
我可以用找到的查询,而不是聚集查询,但是我会请求后,进行大量的处理,这个过程能够尽快与$group
等来这样做,我宁愿保持聚合框架。
感谢,
编辑:
这里是我的准则:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
你可以发布你的'$匹配'并找到?在大多数用法中,'$ match'和find应该是等价的,但我想确切地看到您正在比较哪些语句以便做出准确的答案。此外,你是否先运行聚合,然后查找?如果你反复重复两遍并比较时间,会发生什么?差异可能是将结果从磁盘移动到内存中的成本。 – wdberkeley 2015-02-06 16:07:34
我在第一篇文章中添加了标准,但是即使没有时间戳标准,我也看到了很大的差距。但是现在我想知道它是否与find()返回一个游标并仅显示第一个结果有关。 – Owumaro 2015-02-06 16:13:41
好吧,我有很多无用的索引,所以我清理了一切,并创建了一个复合索引(与我的$匹配过滤器的字段)。现在我有良好的表现和相同的表现,寻找和聚合$匹配:)问题解决了。 – Owumaro 2015-02-09 13:04:31