Mongo查询中的字段顺序与有序签入

时间:2017-09-06 16:05:58

标签: mongodb

假设您根据2个数据点查询文档。一个是简单的bool参数,另一个是复杂的$ geoWithin计算。

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

mongo会重新排序这些参数,以便在运行复杂的检查之前检查boolField 1st吗?

2 个答案:

答案 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/解释了如何完成默认索引选择。