Quiero decir, por ejemplo, mientras tengo dos condiciones: si la primera condición es verdadera, ¿evitará verificar la segunda?

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

            ]
    }, { '_id': False})

Me gustaría que deje de buscar más cuando coincida con la primera condición, para que no baje el nivel para buscar niños.

¿Es cuestión de argumentos ordenados en el cierre de $OR o más bien mongodb conoce de manera inteligente la jerarquía e influye en el orden de búsqueda por findOne?

4
andilabs 28 ago. 2014 a las 12:22

2 respuestas

La mejor respuesta

Sí, el orden importa, que es una razón importante para una variedad de argumentos que, por supuesto, está ordenada.

Básicamente, esto se conoce como evaluación de "cortocircuito". Entonces, solo cuando la primera condición no coincide, entonces se prueba la siguiente condición y así sucesivamente.

Entonces puede demostrar mejor con una colección como esta:

{ "a": 1 },
{ "a": 2, "b": 1 }

Y luego la siguiente consulta:

db.collection.find({ "$or": [ { "a": 1 }, { "b": 1 } ] })

Lo cual, por supuesto, encuentra ambos documentos, ya que aunque el primero no tiene un elemento para "b", la primera condición se cumple de todos modos. En el segundo documento, dado que el primero falló, el segundo se usó para coincidir.

2
Neil Lunn 28 ago. 2014 a las 08:31

Me gustaría que deje de buscar más cuando coincida en la primera condición, para que no baje el nivel para buscar niños.

La pregunta que debe hacerse es: ¿Cómo puede MongoDB saber cómo ambos lados de $or están satisfechos por un lado? ¿Cómo sabe MongoDB que los documentos que no satisfacen la primera condición no satisfacen la segunda?

Si tuviera que decir que tengo un conjunto de documentos, la mitad con {a:1,b:1} y la otra mitad con {b:2}, ¿cómo puede saber que a:1 OR b:1 está satisfecho en la primera mitad si no tiene idea de qué? parece la segunda mitad?

La respuesta simple es que no. Tiene que buscar ambas condiciones (a través de consultas paralelas que luego se devuelven y se combinan los duplicados), ya que dicho orden realmente no importa a menos que fuera un $and y en este caso la importancia del orden está en el índice, no en la consulta como la consulta se moverá para optimizar la ruta más rápida a los resultados.

Entonces, en realidad, la forma en que funciona MongoDB es que dispara una "consulta" por condición. Esto realmente explica el comportamiento: http://docs.mongodb.org/ manual / referencia / operador / consulta / o / # comportamientos

Cuando se usan índices con $ o consultas, cada cláusula de $ o puede usar su propio índice.

4
Sammaye 28 ago. 2014 a las 09:09