如何有效地对具有复合索引的集合进行$in
查找?
在下面的示例中,索引位于字段a和b上。 EG:db.foo.createIndex({a: 1, b: 1})
SQL示例:
SELECT *
FROM foo
WHERE (a,b)
IN (
("aVal1", "bVal1"),
("aVal2", "bVal2")
);
我知道您可以做类似的事情:
db.foo.find( {
$or: [
{ a: "aVal1", b: "bVal1" },
{ a: "aVal2", b: "bVal2" },
]
} )
使用$in
运算符是否有更高效的方法?
答案 0 :(得分:3)
由于您已经为(a, b)
创建了复合索引,因此索引支持所有子句表达式-> mongo将使用索引扫描而不是集合扫描。它可能足够快。
在评估$ or表达式中的子句时,MongoDB会执行集合扫描,或者,如果索引支持所有子句,则MongoDB会执行索引扫描。也就是说,为了使MongoDB使用索引来评估$ or表达式,$ or表达式中的所有子句都必须由索引支持。否则,MongoDB将执行集合扫描。
现在关于您的问题
使用$ in运算符是否有更高效的方法?
$in
匹配整个字段。如果要匹配(a,b)
,则显然(a,b)
必须成为嵌入对象才能使用$in
搜索。
不确定制作嵌入式对象是否符合您当前的架构/要求。但是如果是这样,$in
has known for better performance comparing to $or
:
使用$或等于检查同一字段的值时,请使用$ in运算符而不是$ or运算符。
在这种情况下,如果您嵌入了{e: {a: 'x', b: 'y'}}
之类的对象,那么db.collections.createIndex({e: 1})
与$in
配对将加快处理速度