Mongodb查询 - 使用复合索引时关键序列是否重要

时间:2016-05-02 08:14:44

标签: mongodb mongodb-query mongodb-indexes

补充我创建的索引如下: -

db.collection.createIndex( { propA: 1, propB: 1, propC:1 } )

我查询如下: -

db.collection.find({propB:'x', propC: 'y', propA:'z'})

将mongo查询引擎使用上面创建的索引与否。 在编写查询时,关键序列是否与复合索引的使用有关?

2 个答案:

答案 0 :(得分:1)

查询中键的顺序无关紧要:MongoDB足够聪明,可以查看所有查询的属性并找到合适的索引。

但是,在索引中定义的键的顺序很重要:复合索引可以按照它们在索引文档中定义的顺序用于match queries against any prefix of its keys。因此,您的上述索引可用于回答apply(df[, c("cols on which median should be calculated")], 2, median, na.rm=T) 之类的查询,但不能回复{propA: 'x', propB: 'y'}之类的查询。

您可以使用explain()来确定MongoDB将用于特定查询的索引。

答案 1 :(得分:0)

为了添加Avish的答案,这种包含多个字段的索引称为复合索引。复合索引中列出的字段顺序非常重要。原因如下:

索引将包含对首先按第一个字段的值排序的文档的引用,并且在第一个字段的每个值内,按第二个字段的值排序,并在第二个字段的每个值内,按值排序第三个字段,依此类推。

例如,在您的情况下,索引将包含对首先按propA字段的值排序的文档的引用,并且在propA字段的每个值内,按propB字段的值排序,并在propB字段的每个值内排序,按propC字段的值排序。

所以请记住,以下查询将使用给定的索引:

  • db.collection.find({propA:' Z'})
  • db.collection.find({propB:' x',propC:' y',propA:' z'})
  • db.collection.find({propB:' x',propA:' z'})

以下不能使用给定的索引:

  • db.collection.find({PROPB:' X'})
  • db.collection.find({propC:' Y'})
  • db.collection.find({propB:' x',propC:' y'})