如何使用$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
运算符来执行此操作?
由于您已经为 创建了复合索引(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
会加快速度