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

时间:2017-06-04 15:43:53

标签: mongodb aggregation-framework

我的集合testData包含大约4百万个具有相同结构的文档:

{"_id" : ObjectId("5932c56571f5a268cea12226"), 
"x" : 1.0, 
"text" : "w592cQzC5aAfZboMujL3knCUlIWgHqZNuUcH0yJNS9U4", 
"country" : "Albania", 
"location" : {
    "longitude" : 118.8775183, 
    "latitude" : 75.4316019
}}

该集合在(country,location.longitude)对上编入索引。

我认为相同且产生相同输出的以下两个查询的执行时间相差100倍:

db.testData.aggregate(  
[ 
    { $match : {country : "Brazil"} }, 
    { $sort : { "location.longitude" : 1 } },
    { $project : {"_id" : 0, "country" : 1, "location.longitude" : 1} }
]); 

(这个在重复查询后大约6秒内产生输出,第一次查询大约120秒产生输出)

db.testData.find(
    { country : "Brazil" }, 
    {"_id" : 0, "country" : 1, "location.longitude" : 1}
).sort(
    {"location.longitude" : 1} 
); 

(这个重复查询在15毫秒内产生输出,第一次查询产生大约1秒)。

我在这里缺少什么? Thanx任何反馈。

1 个答案:

答案 0 :(得分:0)

MongoDB查找操作用于根据过滤器从集合中获取文档。 MongoDB聚合对一个集合中的值进行分组,并通过执行管道中的阶段并返回计算结果来对值组执行计算。

与聚合操作相比,MongoDB查找操作执行速度快,因为聚合操作将多个阶段封装到管道中,管道对存储到集合中的数据执行计算,每个阶段的输出用作另一个阶段的输入并返回处理结果。 Mongo DB find操作将游标返回到与过滤器匹配的已获取文档,并且迭代游标以访问文档。

根据上述描述,我们只需要获取国家/地区密钥值为巴西的文档,并按照经度键的值按升序对文档进行排序,这可以使用MongoDB查找操作轻松完成。