我在createdAt日期字段上有一个索引。
我有一个以 $match 阶段作为第一阶段的聚合:
{
"$expr" : {
"$gte" : [
"$createdAt",
{
"$dateSubtract" : {
"startDate" : "$$NOW",
"unit" : "week",
"amount" : 2
}
}
]
}
}
当我查看查询计划时,该查询不使用索引。如果我将日期硬编码到查询中,它将使用索引(例如
"createdAt": { $gte: ISODate("2023-12-25") }
)。
如果我给出索引提示,它会正确使用索引。难道我做错了什么?查询规划器选择 colscan 是否是因为此时它比使用索引更快?我担心当我将此查询发布到生产中时,性能会下降,因为它不会使用索引。
有人可以解释为什么索引没有被使用,除非我特别给出索引提示吗?
文档不是100%清晰,它只说明:
放置在
运算符中的$eq
、$lt
、$lte
、$gt
和$gte
比较运算符可以使用$expr
阶段引用的from
集合上的索引。$lookup
我假设,如果在
$lookup
阶段使用索引,那么 MongoDB 也应该能够在 $match
阶段使用索引。
我认为使用索引提示更好。