Mongo $ in与复合指数

时间:2018-08-17 14:57:54

标签: mongodb

如何有效地对具有复合索引的集合进行$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运算符是否有更高效的方法?

1 个答案:

答案 0 :(得分:3)

由于您已经为(a, b)创建了复合索引,因此索引支持所有子句表达式-> mongo将使用索引扫描而不是集合扫描。它可能足够快。

参考:$or Clauses and Indexes

  

在评估$ 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配对将加快处理速度