mongo db findOne 和 $or 参数顺序重要还是层次结构重要?[表现]

and*_*abs 5 python performance mongodb pymongo mongodb-query

我的意思是,例如有两个条件:如果第一个条件为真,它会避免检查第二个条件吗?

doc = collection.find_one(
    {'$or': [
              {
               'k': kind,
               'i': int(pk)
              },
              {
               'children.k': kind, 
               'children.i': int(pk)
              }

            ]
    }, { '_id': False})
Run Code Online (Sandbox Code Playgroud)

我希望它在匹配第一个条件时停止进一步搜索,所以它不会降低搜索孩子的级别。

$OR闭包中的参数顺序问题,还是 mongodb 巧妙地了解层次结构并影响搜索顺序findOne

Nei*_*unn 4

是的,顺序很重要,这是使用数组形式的参数的一个重要原因,当然,参数是有序的。

所以基本上这被称为“短路”评估。因此,只有第一个条件不匹配时,才会测试下一个条件,依此类推。

因此最好用这样的集合来演示:

{ "a": 1 },
{ "a": 2, "b": 1 }
Run Code Online (Sandbox Code Playgroud)

然后是以下查询:

db.collection.find({ "$or": [ { "a": 1 }, { "b": 1 } ] })
Run Code Online (Sandbox Code Playgroud)

当然,这会找到两个文档,因为即使第一个文档没有“b”元素,但无论如何都满足第一个条件。在第二个文档中,由于第一个文档失败,因此使用第二个文档进行匹配。