假設您正在根據2個數據點查詢文檔。一個是簡單的bool參數,另一個是複雜的$ geoWithin計算。Mongo查詢中的字段順序與訂購檢入
db.collection.find({"geoField": { "$geoWithin" : ...}, "boolField" : true})
將MONGO重新排列這些參數,以便它檢查boolField 1,運行復雜的檢查之前?
假設您正在根據2個數據點查詢文檔。一個是簡單的bool參數,另一個是複雜的$ geoWithin計算。Mongo查詢中的字段順序與訂購檢入
db.collection.find({"geoField": { "$geoWithin" : ...}, "boolField" : true})
將MONGO重新排列這些參數,以便它檢查boolField 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" : ...} })
的性能。並讓我們知道:)
要添加到上面的響應,如果你想讓mongo使用特定的索引,你可以使用cursor.hint。這https://docs.mongodb.com/manual/core/query-plans/解釋如何完成默認索引選擇。