我的意思是例如有两个条件:如果第一个条件为真,它会避免检查第二个吗?
doc = collection.find_one(
{'$or': [
{
'k': kind,
'i': int(pk)
},
{
'children.k': kind,
'children.i': int(pk)
}
]
}, { '_id': False})
我希望它在匹配第一个条件时停止进一步搜索,所以它不会降低搜索孩子的水平。
$OR
闭包中的参数顺序是否重要,或者mongodb巧妙地了解层次结构,它会影响findOne
的搜索顺序?
答案 0 :(得分:4)
我希望它在第一个条件匹配时停止进一步搜索,所以它不会降低搜索孩子的水平。
您必须问自己的问题是:MongoDB如何知道$or
的双方是如何满意的? MongoDB如何知道不满足第一个条件的文档不满足第二个条件?
如果我要说我有一组文件,一半是{a:1,b:1}
,另一半是{b:2}
,你怎么知道a:1 OR b:1
如果你有上半不知道下半场是什么样的?
简单的答案是它没有。它必须搜索这两个条件(通过并行查询然后返回并重复合并),因为这样的顺序并不重要,除非它是$and
,在这种情况下,顺序的重要性在索引而不是查询中查询将被移动以优化最快的结果路径。
所以实际上,MongoDB的工作方式是它会发出一个"查询"每个条件。这实际上解释了行为:http://docs.mongodb.org/manual/reference/operator/query/or/#behaviors
当使用带有$或查询的索引时,$或者每个子句都可以使用自己的索引。
答案 1 :(得分:2)
是的,顺序很重要,这是数组形式的参数的一个强有力的理由,当然这是有序的。
所以基本上这被称为“短路”评估。因此,只有在第一个条件不匹配的情况下,才会测试下一个条件,等等。
最好用这样的集合来证明:
{ "a": 1 },
{ "a": 2, "b": 1 }
然后是以下查询:
db.collection.find({ "$or": [ { "a": 1 }, { "b": 1 } ] })
当然找到这两个文件,因为即使第一个没有“b”的元素,无论如何都要满足第一个条件。在第一个失败后的第二个文件中,第二个用于匹配。