复合指数
{
A: 1,
B: 1
}
在这个查询中,没有使用复合索引:
db.user.aggregate([
{ $match: {
B: { $gt: 100 }
} },
{
$sort: {
A: 1
}
},
{
$limit: 1000
}
])
我需要这样做才能让它使用索引:
db.user.aggregate([
{ $match: {
A: { $exists: true }
B: { $gt: 100 }
} },
{
$sort: {
A: 1
}
},
{
$limit: 1000
}
])
添加
A: { $exists: true }
是不必要的,因为所有文档都会有此字段。我以为mongodb足够聪明,可以使用索引来排序?
索引字段的顺序很重要。索引从左到右读取。
索引字段的顺序会影响复合索引的有效性。复合索引根据索引中字段的顺序包含对文档的引用。要创建高效的复合索引,请遵循 ESR(相等、排序、范围)规则。
取自MongoDB复合索引文档的字段顺序。
如果在第一阶段中使用,或者如果$sort
阶段之前仅是
$sort
阶段(文档
),则
$match
将使用索引。
按照以下顺序创建新索引应该可以解决您的问题:
{
"B": 1,
"A": 1
}
这当然是假设您的索引尚未正确排序。