我在MongoDB中有一个查询,我想优先考虑第一个字段,然后再考虑第二个字段。
比如说,我需要进行以下查询:
db.col.find({category: A}).sort({updated: -1, rating: -1}).limit(10).explain()
所以我创建了以下索引
db.col.ensureIndex({category: 1, rating: -1, updated: -1})
当我需要扫描尽可能多的对象时,即10
个对象,它可以完美地工作。
但是现在我需要查询
db.col.find({category: { $ne: A}}).sort({updated: -1, rating: -1}).limit(10)
于是我创建了以下索引:
db.col.ensureIndex({rating: -1, updated: -1})
但这会导致整个文档被扫描,而当我创建时
db.col.ensureIndex({ updated: -1 ,rating: -1})
扫描的文档数量更少:
我只是想问清楚在多个字段上排序时应该保留什么顺序。通过阅读MongoDB文档,很明显需要对进行排序的字段应该是最后一个字段。因此,在我的$ne
查询中,我假设了这种情况。我有做错什么吗?
category
,复合排序顺序为{updated: -1, rating: -1}
。索引中键的顺序(和方向)很重要;建议的索引将无法有效地支持按{rating: -1, updated: -1}
排序的content
搜索。如果您正在使用驱动程序操作复合排序值,请使用有序哈希/字典来确保保留排序。有关更多信息,请参见 MongoDB 文档中的 Sort on Multiple Fields。 - Stennie