2012-01-16 16 views
0

在mongodb查詢中使用javascript表達式而不是使用標準BSON表示法會有什麼性能影響。例如:

>db.myCollection.find({ a : { $gt: 3 } }); 
>db.myCollection.find({ $where: "this.a > 3" }); 

會先查詢比如果有一個列上沒有索引,第二個快?此外,有沒有什麼辦法可以編寫查詢

>db.myCollection.find({ $where: "this.a/10 > 3" }); 

>db.myCollection.find({ $where: "this.a/this.b > 3" }); 

不使用$,這裏符號?

回答

2

會先查詢比如果有一個列上沒有索引,第二個快?

在這兩種情況下,第一個基本上總是會更快。 $where子句將使用JavaScript引擎。每個實例只能運行一個JavaScript引擎,因此可能需要等待。此外,$where子句將不得不將對象移入和移出JavaScript VM,這會增加開銷,並且速度會更慢。

此外,有沒有什麼辦法寫查詢... .find({ $where: "this.a/this.b > 3" });沒有使用$符號?

這裏的答案是。查詢引擎不支持在對象內比較數據的任何查詢。這裏唯一的解決方法是:

  1. 預先計算列(我敢肯定,你想避免
  2. 某處運行for循環,這種「手動」做。這可以通過Map/Reduce或客戶端查詢完成。

當然,這兩種解決方案都是次優的。這在MongoDB的功能中絕對是一個整體。

2

從這裏:

http://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-%7B%7B%24where%7D%7DClausesandFunctionsinQueries

「注意:如果一個正常的數據驅動BSON查詢表達式是可能的,使用建築用$就是當你必須將它僅僅是顯著更慢。」

關於第二個問題:你可以做

{ a : { $gt: 0.3 } } 
+0

謝謝,看到我對第二個問題的更新,第一個問題很簡單。關鍵是,我怎樣才能在查詢中組合幾個文檔屬性或對其中的某些屬性執行操作(如在關係數據庫中構建計算列)。 – 2012-01-16 02:41:30