2017-06-04 110 views
0

我收藏TESTDATA具有一定4長槍文檔與相同的結構:使用db.collection.find()方法的Mongodb查詢比使用db.collection.aggregate()快100倍?

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

的集合上(國家,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秒用於第一時間查詢)產生輸出。

我在這裏錯過了什麼?感謝任何反饋。

+0

您錯過了聚合與查找不同的事實。是的,對於你的查詢你應該使用find。如果你真的在做聚合,那麼你會使用聚合框架。它比較慢,因爲它針對不同的事情進行了優化,並且可能在引擎蓋下使用了一個光標以允許這些事情發生。 – Paul

+0

@Paul - 感謝您的及時回覆。我正在考慮對大多數查詢使用聚合框架(我將我的應用程序從MySQL移動到MongoDB),因爲它似乎更通用,我需要一些計算,但這種速度差異是該計劃的一大缺點。 .. –

+0

使用合適的工具進行正確的工作。 – Paul

回答

0

MongoDB查找操作用於根據過濾器從集合中獲取文檔。 MongoDB聚合從一個集合中分組值,並通過執行管道中的階段並返回計算結果來對一組值執行計算。

MongoDB查找操作與聚合操作相比快速執行,因爲聚合操作將多個階段封裝到管道中,該管道對存儲到集合中的數據執行計算,每個階段的輸出作爲另一階段的輸入並返回處理結果。 MongoDB查找操作返回一個光標來獲取匹配過濾器的文檔,並且光標被迭代訪問文檔。

根據上述描述,我們只需要獲取那些國家代碼值爲巴西的文檔,並根據經度密鑰的值按照升序排序文檔,這可以使用MongoDB查找操作輕鬆完成。

+0

嗯,不,這實際上是一個更廣泛的問題,坦率地說,沒有太多的答案是真的。任何用途都沒有任何問題和答案應該是「經驗的」。 Question and Answer應該顯示出現差異的原因和原因。最近的代碼中我還沒有做過「深入探索」,但在MongoDB 2.6時代,查詢引擎發生了重大變化,部分原因是爲了查看標準的'.find()'和'.aggregate( )在這些基本操作中使用了相同的東西。這裏沒有任何經驗原因或反應。 –

+0

@Rubin Thanx的答覆。實際上,對於這些查詢,我只是根據指定的標準測試了兩種方法(查找vs聚合),以篩選所需文檔的速度。隨後,我想添加其他聚合階段來處理在此階段中過濾的文檔。但是,如果aggregate()比find()慢得多,那麼根本無法使用它進行初始過濾。對於大數據標準(大約30Mb的數據),這只是一個非常小的集合,我不敢想如果我試圖用嚴重的Gb集合來做這件事情會發生什麼。 –