如何高效地做好$in
使用复合索引查找集合?
下面的示例中,索引位于字段 a 和 b 上。例如: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
操作员?
由于您已经为以下内容创建了复合索引(a, b)
,所有子句表达式都受索引支持 -> mongo 将使用索引扫描而不是集合扫描。它可能足够快。
参考:$or 子句和索引 https://docs.mongodb.com/manual/reference/operator/query/or/#or-clauses-and-indexes
当评估 $or 表达式中的子句时,MongoDB 会执行集合扫描,或者如果索引支持所有子句,MongoDB 会执行索引扫描。也就是说,为了让 MongoDB 使用索引来计算 $or 表达式,$or 表达式中的所有子句都必须有索引支持。否则,MongoDB 将执行集合扫描。
现在关于你的问题
是否有更高效的方法使用 $in 运算符来执行此操作?
$in
匹配整个字段。如果你想搭配(a,b)
那么显然(a,b)
必须成为要搜索的嵌入对象$in
.
不确定制作嵌入对象是否适合您当前的架构/要求。但如果真是这样的话$in众所周知,与相比具有更好的性能$or https://docs.mongodb.com/manual/reference/operator/query/or/#or-versus-in:
当使用 $or 来对同一字段的值进行相等检查时,请使用 $in 运算符而不是 $or 运算符。
在这种情况下,如果您有嵌入的对象,例如:{e: {a: 'x', b: 'y'}}
then db.collections.createIndex({e: 1})
与$in
会加快速度
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)