使用db.collection.find()方法进行Mongodb查询比使用db.collection.aggregate()快100倍?
我收集的testData有大约400万个结构相同的文档:使用db.collection.find()方法进行Mongodb查询比使用db.collection.aggregate()快100倍?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我收集的testData有大约400万个结构相同的文档: {"_id" : ObjectId("5932c56571f5a268cea12226"), "x" : 1.0, "text" : "w592cQzC5aAfZboMujL3knCUlIWgHqZNuUcH0yJNS9U4", "country" : "Albania", "location" : { "longitude" : 118.8775183, "latitude" : 75.4316019 }}
{"_id" : ObjectId("5932c56571f5a268cea12226"),
"x" : 1.0,
"text" : "w592cQzC5aAfZboMujL3knCUlIWgHqZNuUcH0yJNS9U4",
"country" : "Albania",
"location" : {
"longitude" : 118.8775183,
"latitude" : 75.4316019
}}
集合在(国家、位置、经度)对上建立索引
以下两个查询,我认为相同且产生相同的输出,在执行时间上相差100倍:
db.testData.aggregate(
[
{ $match : {country : "Brazil"} },
{ $sort : { "location.longitude" : 1 } },
{ $project : {"_id" : 0, "country" : 1, "location.longitude" : 1} }
]);
(对于重复查询,此项在大约6秒内生成输出,对于第一次查询,此项在大约120秒内生成输出)
(对于重复查询,此函数在15毫秒内生成输出,对于第一次查询,此函数在大约1秒内生成输出)
我错过了什么?Thanx获取任何反馈。MongoDB查找操作用于根据过滤器从集合中获取文档。 MongoDB聚合将集合中的值分组,并通过执行管道中的阶段对值组执行计算,并返回计算结果 与聚合操作相比,MongoDB find操作执行速度更快,因为聚合操作将多个阶段封装到管道中,管道对存储在集合中的数据执行计算,每个阶段的输出作为另一个阶段的输入,并返回处理结果。 Mongo DB find操作将游标返回到匹配筛选器的已获取文档,并对游标进行迭代以访问文档
根据上述描述,我们只需要获取国家密钥值为巴西的文档,并根据经度密钥值按升序对文档进行排序,这可以使用MongoDB find操作轻松完成。您忽略了聚合与查找不同的事实。是的,对于您的查询,您应该使用find。如果您实际上是在进行聚合,那么您将使用聚合框架。它的速度较慢,因为它针对不同的事情进行了优化,而且可能是在引擎盖下使用了一个光标,以便考虑到这些事情。@Paul-Thanx以获得快速回复。我在考虑对大多数查询使用聚合框架(我正在将我的应用程序从MySQL移动到MongoDB),因为它似乎更通用,而且我需要进行一些计算,但这种速度上的差异是该计划的一大缺点……使用正确的工具来完成正确的工作。你是否使用这些工具来调查两个查询的执行计划的差异?@Vince是的,我用过。他们都声称使用了提供的索引。我还尝试了不带索引的aggregate()查询,在这种情况下,性能(正如人们所期望的)甚至更差,同一个查询需要几分钟的时间。嗯,不。这实际上是一个更广泛的问题,坦率地说,并不是一个真正的答案尝试。任何问题和答案都应该是“经验性的”。问题和答案应显示出现差异的地方和原因的可复制示例。我最近没有对代码进行“深入研究”,但在MongoDB 2.6的时候,对查询引擎进行了重大更改,部分原因是为了看到标准的
。find()
和。aggregate()
在这些基本操作中使用了相同的东西。“这里没有任何经验上的原因或反应造成任何差异。”鲁宾·坦克斯回答。实际上,对于这些查询,我只是在测试这两种方法(find vs aggregate)根据指定标准过滤所需文档的速度。随后,我想添加其他聚合阶段来处理在此阶段中过滤的文档。但是,如果aggregate()比find()慢得多,那么将其用于初始筛选是毫无意义的。对于大数据标准来说,这只是一个非常小的集合(大约30MB的数据),我不敢想象,如果我尝试使用严肃的Gb集合,会发生什么。。
db.testData.find(
{ country : "Brazil" },
{"_id" : 0, "country" : 1, "location.longitude" : 1}
).sort(
{"location.longitude" : 1}
);