我的意思是例如有两个条件:如果第一个条件为真,它会避免检查第二个吗?
doc = collection.find_one(
{'$or': [
{
'k': kind,
'i': int(pk)
},
{
'children.k': kind,
'children.i': int(pk)
}
]
}, { '_id': False})
我希望它在匹配第一个条件时停止进一步搜索,这样它就不会在较低级别搜索 child 。
是 $OR
闭包中的参数顺序问题还是 mongodb 清楚地知道层次结构并影响 findOne
的搜索顺序?
最佳答案
I would like that it stops further searching when matchin first condition, so it not goes lower level to search around children.
你要问自己的问题是: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
When using indexes with $or queries, each clause of an $or can use its own index.
关于python - mongodb findOne 和 $or 参数的顺序重要还是层次结构? [表现],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25544097/