MongoDB如何评估多个$或语句?

时间:2012-03-16 13:37:22

标签: mongodb

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'); 

2 个答案:

答案 0 :(得分:3)

MongoDB将作为单独的查询执行$或操作的每个子句,并删除重复项作为后处理过程。因此,每个子句都可以使用单独的索引,这通常非常有用。

换句话说,它不会查看1个文档,看看哪个OR子句适用,如果第一个子句匹配则执行提前输出。相反,它会对每个子句执行完整的数据集查询,并在事后进行重复数据删除。这可能看起来效率不高,但实际上它几乎总是更快,因为第一种方法只能在所有条款中最多只能达到一个指数,这种指数很少有效。

答案 1 :(得分:1)

编辑:Mongo仅在重复数据删除过程中跳过文档,而不是在表扫描期间。

Mongo不会检查已经属于结果集的文档。因此,如果您的第一个{a:1,b:12}返回100%的文档,则Mongo已完成。

由于这个原因,您希望将获取大多数文档的内容作为您的第一个评估语句。如果您的第一个项目仅获得1%的文档,则后续项目将需要扫描其他99%的文档。

话虽如此,您正在使用$或在单个键中查找值。我想你想用$ in。

请点击此处了解更多信息:

http://books.google.com/books?id=BQS33CxGid4C&lpg=PA48&ots=PqvQJPRUoe&dq=mongo%20tips%20and%20tricks%20%22OR-query%22&pg=PA48#v=onepage&q&f=false