Mongo $in 与复合索引

new*_*ere 5 mongodb

如何使用$in复合索引有效地查找集合?

下面的示例中,索引位于字段 a 和 b 上。例如:db.foo.createIndex({a: 1, b: 1})

SQL 中的示例:

SELECT * 
FROM foo 
WHERE (a,b) 
  IN (
    ("aVal1", "bVal1"),
    ("aVal2", "bVal2")
  );
Run Code Online (Sandbox Code Playgroud)

我知道你可以这样做:

db.foo.find( {
    $or: [
        { a: "aVal1", b: "bVal1" },
        { a: "aVal2", b: "bVal2" },
    ]
} )
Run Code Online (Sandbox Code Playgroud)

是否有更高效的方法来使用$in运算符来执行此操作?

Mạn*_*yễn 3

由于您已经为 创建了复合索引(a, b),因此索引支持所有子句表达式 -> mongo 将使用索引扫描而不是集合扫描。它可能足够快。

参考:$or 子句和索引

当评估 $or 表达式中的子句时,MongoDB 执行集合扫描,或者,如果索引支持所有子句,MongoDB 执行索引扫描。也就是说,为了让 MongoDB 使用索引来计算 $or 表达式,$or 表达式中的所有子句都必须有索引支持。否则,MongoDB 将执行集合扫描。

现在关于你的问题

是否有更高效的方法使用 $in 运算符来执行此操作?

$in匹配整个字段。如果你想匹配,(a,b)那么显然(a,b)必须成为一个嵌入对象来搜索$in

不确定制作嵌入对象是否适合您当前的架构/要求。但如果是这样的话,$in与以下相比,已知性能更好$or

当使用 $or 来对同一字段的值进行相等检查时,请使用 $in 运算符而不是 $or 运算符。

在这种情况下,如果您有嵌入的对象,例如:{e: {a: 'x', b: 'y'}}那么db.collections.createIndex({e: 1})配对$in会加快速度