Mongo $in查询在复合索引中的使用

5
如何在具有复合索引的集合上高效地执行$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运算符来完成这个操作?

你的索引是什么?样本文档是什么?是什么让你相信$in是更好的方法? - kmdreko
@kmdreko 在问题中添加了索引信息。使用$or语法一次查找数千条记录似乎比在具有单个字段索引的集合上执行$in要慢得多。我希望有一个更高效的解决方案。示例文档是具有这两个键和复合索引以及其他一些数据的文档(不确定其他数据与问题有何关联,但如果有,请告诉我,我可以添加更多细节)。 - newUserNameHere
1个回答

3
由于您已经为 (a,b) 创建了复合索引,所有查询表达式都受到索引的支持 -> mongo 将使用索引扫描而不是集合扫描。这可能足够快。

参考资料:$or Clauses and Indexes

在评估 $or 表达式中的子句时,MongoDB 将执行集合扫描,或者如果所有子句都受到索引的支持,则 MongoDB 执行索引扫描。也就是说,为了使 MongoDB 使用索引来评估 $or 表达式,$or 表达式中的所有子句都必须受到索引的支持。否则,MongoDB 将执行集合扫描。

现在回答您的问题

是否有更有效的方法使用 $in 运算符?

$in 匹配整个字段。如果要匹配 (a,b),那么显然 (a,b) 必须成为嵌入对象以便使用 $in 进行搜索。

不确定嵌入式对象是否符合您当前的架构/要求。但如果是这种情况,$in已知比$or性能更好

当使用$or进行相同字段值的相等检查时,请改用$in运算符。

在这种情况下,如果您有像这样的嵌入式对象:{e: {a: 'x', b: 'y'}},则db.collections.createIndex({e: 1})$in配对将加快速度


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接