$orEl
$orEl operador realiza unaORoperación lógica en una matriz de uno o más<expressions>y selecciona los documentos que satisfacen al menos uno de<expressions>los.
Compatibilidad
Puedes usar $or para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El operador $or tiene la siguiente sintaxis:
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
Considera el siguiente ejemplo:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
Esta query seleccionará todos los documentos de la colección inventory donde el valor del campo quantity sea menor que 20 o el valor del campo price sea igual a 10.
Comportamientos
$or Cláusulas e índices
Al evaluar las cláusulas en la expresión $or, MongoDB realiza un escaneo de colección o, si todas las cláusulas están respaldadas por índices, MongoDB realiza escaneos de índice. Es decir, para que MongoDB pueda utilizar índices para evaluar una expresión de $or, todas las cláusulas de la expresión $or deben estar respaldadas por índices. De lo contrario, MongoDB realizará un escaneo de colección.
Al utilizar índices con queries $or, cada cláusula de $or puede utilizar su propio índice. Considere el siguiente query:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
Para dar soporte a esta query, en lugar de un índice compuesto, debe crear un índice en quantity y otro en price:
db.inventory.createIndex( { quantity: 1 } ) db.inventory.createIndex( { price: 1 } )
$or y text Consultas
Si $or incluye un query $text, todas las cláusulas del arreglo $or deben estar respaldadas por un índice. Esto se debe a que un query $text debe usar un índice, y $or solo puede usar índices si todas sus cláusulas son compatibles con índices. Si el query $text no puede utilizar un índice, devolverá un error.
Nota
$text Proporciona funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de consulta de texto completo: Atlas Search.
$or y queries geoespaciales
$or admite queries geoespaciales. Sin embargo, si utiliza una cláusula near ($near o $nearSphere), $or no puede contener ninguna otra cláusula. El uso de $or con una sola cláusula tiene el mismo efecto que omitir el operador $or.
Por ejemplo, el siguiente query no es válido porque el operador $or combina $near con otra cláusula:
db.places.find( { $or: [ { location: { $near: [ 40, 5 ] } }, { category: "restaurant" } ] } )
El siguiente query es válido porque $or utiliza una cláusula geoespacial que no es near ($geoIntersects):
db.places.find( { $or: [ { location: { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ 39, 4 ], [ 41, 4 ], [ 41, 6 ], [ 39, 4 ] ] ] } } } }, { category: "restaurant" } ] } )
$or y operaciones de clasificación
Al ejecutar queries $or con sort(), MongoDB puede usar índices que admitan las cláusulas $or.
$or e índices parciales
Puede crear índices parciales con $or. Utilice partialFilterExpression del método db.collection.createIndex() para crear un índice parcial.
$or versus $in
Al utilizar $or con <expressions> que son comprobaciones de igualdad para el valor del mismo campo, utilice el operador $in en lugar del operador $or.
Por ejemplo, para seleccionar todos los documentos en la colección inventory donde el valor del campo quantity sea igual a 20 o 50, use el operador $in:
db.inventory.find ( { quantity: { $in: [20, 50] } } )
Cláusulasanidadas $or
Puede anidar operaciones $or.
Error Handling
Para permitir que el motor de queries las optimice, $or gestiona los errores de la siguiente manera:
Si alguna expresión suministrada a
$orcausara un error al evaluarse por sí sola, el$orque contiene la expresión podría causar un error, pero no se garantiza que ocurra.Una expresión proporcionada después de la primera proporcionada a
$orpuede causar un error incluso si la primera expresión se evalúa comotrue.
Por ejemplo, la siguiente query siempre produce un error si $x es 0:
db.example.find( { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } )
La siguiente query, que contiene múltiples expresiones suministradas a $or, puede generar un error si hay algún documento donde $x sea 0:
db.example.find( { $or: [ { x: { $eq: 0 } }, { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } ] } )