假设您根据2个数据点查询文档。一个是简单的bool参数,另一个是复杂的$ geoWithin计算。
db.collection.find( {"geoField": { "$geoWithin" : ...}, "boolField" : true} )
mongo会重新排序这些参数,以便在运行复杂的检查之前检查boolField 1st吗?
答案 0 :(得分:1)
MongoDB使用与任何其他数据库一样的索引。因此,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" : ...} } )
的效果。让我们知道:))
答案 1 :(得分:0)
要添加到上面的响应,如果你想让mongo使用特定的索引,你可以使用cursor.hint。这个https://docs.mongodb.com/manual/core/query-plans/解释了如何完成默认索引选择。