mongodb 查询不利用带有 $expr 的索引

问题描述 投票:0回答:1

我在createdAt日期字段上有一个索引。

我有一个以 $match 阶段作为第一阶段的聚合:

{   
    "$expr" : {
        "$gte" : [
            "$createdAt",
            {
                "$dateSubtract" : {
                    "startDate" : "$$NOW",
                    "unit" : "week",
                    "amount" : 2
                }
            }
        ]
    }
}

当我查看查询计划时,该查询不使用索引。如果我将日期硬编码到查询中,它将使用索引(例如

 "createdAt": { $gte: ISODate("2023-12-25") }
)。

如果我给出索引提示,它会正确使用索引。难道我做错了什么?查询规划器选择 colscan 是否是因为此时它比使用索引更快?我担心当我将此查询发布到生产中时,性能会下降,因为它不会使用索引。

有人可以解释为什么索引没有被使用,除非我特别给出索引提示吗?

mongodb aggregation-framework mongodb-indexes
1个回答
0
投票

文档不是100%清晰,它只说明:

放置在

$eq
运算符中的
$lt
$lte
$gt
$gte
$expr
比较运算符可以使用
from
阶段引用的
$lookup
集合上的索引。

我假设,如果在

$lookup
阶段使用索引,那么 MongoDB 也应该能够在
$match
阶段使用索引。

我认为使用索引提示更好。

© www.soinside.com 2019 - 2024. All rights reserved.