$expr 中的 mongodb $in 运算符不使用索引

noN*_*ich 2 mongodb aggregation-framework

我需要包含多个标识符的文档

它不起作用(冻结):

db.collection.aggregate([{
    $match: {
        $expr: {
            $in: ['$_id', [4, 6]]
        }
    }
}]);
Run Code Online (Sandbox Code Playgroud)

但它有效:

db.collection.find({
    _id: {
        $in: [4, 6]
    }
});
Run Code Online (Sandbox Code Playgroud)

Tak*_*kis 5

$expr索引使用有限制, 请参阅此

只有 $eq、$lt、$lte、$gt 和 $gte 聚合运算符可以使用索引

过去支持的运算符甚至更少,MongoDB 5.0 添加了更多,并且可能下一个版本会添加更多。

$in聚合运算符不能使用索引。但如果你把它替换为

aggregate(
[{"$match":
  {"$expr":{"$or":[{"$eq":[4, "$_id"]}, {"$eq":[6, "$_id"]}]}}}])
Run Code Online (Sandbox Code Playgroud)

速度会很快,并且会使用索引。
在这里,您可以避免$expr使用$in查询运算符而不是$in聚合运算符,如注释中所述。

{ $match: { _id: {$in: [4, 6]} }
Run Code Online (Sandbox Code Playgroud)