Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用db.collection.find()方法进行Mongodb查询比使用db.collection.aggregate()快100倍?_Mongodb_Aggregation Framework - Fatal编程技术网

使用db.collection.find()方法进行Mongodb查询比使用db.collection.aggregate()快100倍?

使用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 }}

我收集的testData有大约400万个结构相同的文档:

{"_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} 
);