Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo$in与复合索引_Mongodb - Fatal编程技术网

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在问题中添加了索引信息。这种一次查找数千条记录的
$或
语法似乎比在具有单个字段索引的集合上执行
$要慢得多。我希望有一个更有效的解决方案。示例文档包含这两个键以及复合索引和一些其他数据(不确定其他数据与问题的相关性如何,但如果让我知道,我可以添加更多详细信息)。