Mongodb Mongo$in与复合索引
如何有效地对具有复合索引的集合执行Mongodb Mongo$in与复合索引,mongodb,Mongodb,如何有效地对具有复合索引的集合执行$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" },
$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表达式中的子句时,MongoDB要么执行集合扫描,要么在索引支持所有子句的情况下,MongoDB执行索引扫描。也就是说,为了让MongoDB使用索引计算$or表达式,索引必须支持$or表达式中的所有子句。否则,MongoDB将执行收集扫描
现在谈谈你的问题
使用$in操作符是否有更有效的方法来实现这一点
$in
匹配整个字段。如果您想匹配(a,b)
,那么显然(a,b)
必须成为一个嵌入对象,以便在中使用$进行搜索
不确定嵌入对象是否符合当前模式/要求。但如果是这样的话:
当使用$or对同一字段的值进行相等检查时,请使用$in运算符而不是$or运算符
在这种情况下,如果您有像这样的嵌入对象:{e:{a:'x',b:'y'}
,那么db.collections.createIndex({e:1})
与$In
配对将加快速度您的索引是什么?什么是样的文件?是什么让你相信$in
是更好的方法?@kmdreko在问题中添加了索引信息。这种一次查找数千条记录的$或
语法似乎比在具有单个字段索引的集合上执行$要慢得多。我希望有一个更有效的解决方案。示例文档包含这两个键以及复合索引和一些其他数据(不确定其他数据与问题的相关性如何,但如果让我知道,我可以添加更多详细信息)。