2017-09-06 35 views
0

假設您正在根據2個數據點查詢文檔。一個是簡單的bool參數,另一個是複雜的$ geoWithin計算。Mongo查詢中的字段順序與訂購檢入

db.collection.find({"geoField": { "$geoWithin" : ...}, "boolField" : true}) 

將MONGO重新排列這些參數,以便它檢查boolField 1,運行復雜的檢查之前?

回答

1

MongoDB像其他任何DB一樣使用索引。所以對於mongoDB來說,重要的是如果任何查詢字段有索引或不是查詢字段的順序。至少在他們的文檔中沒有任何信息mongoDB試圖首先檢查原始查詢字段。因此,對於您的示例,如果boolField有一個索引mongoDB,請首先檢查此字段並刪除其boolField爲false的文檔。但是,如果geoField有索引,那麼mongoDB首先在該字段上執行查詢。

那麼如果他們都沒有索引或兩者都有,會發生什麼?它應該是查詢中字段的給定順序,因爲query optimization page of mongoDB中的索引旁邊沒有任何建議或信息。此外,您只需添加.explain("executionStats")即可隨時測試您的查詢表現。

因此請檢查db.collection.find({"geoField": { "$geoWithin" : ...}, "boolField" : true})db.collection.find({ "boolField" : true, "geoField": { "$geoWithin" : ...} })的性能。並讓我們知道:)