$or$orrealiza unaORoperación lógica en una matriz de una o más expresiones y selecciona documentos que satisfacen al menos una de las expresiones.
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 un escaneo de índice. Si todas las cláusulas están respaldadas por índices, MongoDB realiza exploraciones de índices. Para utilizar los índices para evaluar una expresión $or, todas las cláusulas de la expresión $or deben estar soportadas por índices. De lo contrario, MongoDB realiza un escaneo de la colección.
Al utilizar índices con queries $or, cada cláusula de $or puede utilizar su propio índice. Considere esta query:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
Para admitir esta query, en lugar de un índice compuesto, crea un índice en quantity y otro índice en price:
db.inventory.createIndex( { quantity: 1 } ) db.inventory.createIndex( { price: 1 } )
$or y text Consultas
Si $or incluye una query, todas $text $or las cláusulas en el array deben estar respaldadas por un índice. Esto es porque una $text query debe usar un índice, y $or solo puede usar índices si todas sus cláusulas cuentan con el soporte de índices. Si la $text query no puede usar un índice, la query devuelve un error.
Nota
$text proporciona capacidades de query de texto para implementaciones autogestionadas (no pertenecientes a Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de búsqueda de texto completo, Búsqueda de Atlas.
$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 En comparación con $in
Si usas $or con <expressions> que son comprobaciones de igualdad para el valor del mismo campo, usa $in en lugar de $or.
Esta query selecciona documentos en la colección inventory donde quantity es 20 o 50:
db.inventory.find ( { quantity: { $in: [20, 50] } } )
Cláusulasanidadas $or
Puedes anidar $or operaciones.
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 ] } } ] } )