MongoDB如何评估此查询:
db.testCol.find(
{
"$or" : [ {a:1, b:12}, {b:9, c:15}, {c:10, d:"foo"} ]
});
如果第一个OR语句为TRUE,当扫描文档中的值时,是否还要评估其他语句?
逻辑上,如果MongoDB已经优化,则不应评估OR语句中的其他值,但我不知道如何实现MongoDB。
更新: 我更新了我的查询,因为它是错误的,并没有正确解释我想要完成的事情。我需要找到一组具有不同属性的文档,如果找到这些属性的完全组合,则必须返回该文档。
我的查询的SQL等价物是:
SELECT * FROM testCol
WHERE (a = 1 AND b = 12) OR (b = 9 AND c = 15) OR (c = 10 AND d = 'foo');
答案 0 :(得分:3)
MongoDB将作为单独的查询执行$或操作的每个子句,并删除重复项作为后处理过程。因此,每个子句都可以使用单独的索引,这通常非常有用。
换句话说,它不会查看1个文档,看看哪个OR子句适用,如果第一个子句匹配则执行提前输出。相反,它会对每个子句执行完整的数据集查询,并在事后进行重复数据删除。这可能看起来效率不高,但实际上它几乎总是更快,因为第一种方法只能在所有条款中最多只能达到一个指数,这种指数很少有效。
答案 1 :(得分:1)
编辑:Mongo仅在重复数据删除过程中跳过文档,而不是在表扫描期间。
Mongo不会检查已经属于结果集的文档。因此,如果您的第一个{a:1,b:12}返回100%的文档,则Mongo已完成。
由于这个原因,您希望将获取大多数文档的内容作为您的第一个评估语句。如果您的第一个项目仅获得1%的文档,则后续项目将需要扫描其他99%的文档。
话虽如此,您正在使用$或在单个键中查找值。我想你想用$ in。
请点击此处了解更多信息: