$orLa
$orEl operador realiza una operación lógicaORen una matriz de uno o más<expressions>y selecciona los documentos que cumplen al menos una de las<expressions>.
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> } ] }
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Considera el siguiente ejemplo:
db.movies.find( { $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] }, { _id: 0, title: 1, year: 1, runtime: 1 } )
[ { runtime: 11, title: 'The Great Train Robbery', year: 1903 }, { runtime: 14, title: 'A Corner in Wheat', year: 1909 }, { runtime: 1256, title: 'Centennial', year: 1978 }, { runtime: 1140, title: 'Baseball', year: 1994 }, { runtime: 1, title: 'The Kiss', year: 1896 }, { runtime: 1, title: 'The Kiss', year: 1896 } ]
Esta consulta selecciona todos los documentos de la colección movies que cumplen cualquiera de las siguientes condiciones:
El valor del campo
runtimees mayor que1000.El valor del campo
yeares anterior a1910.
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.movies.find( { $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] } )
Para admitir esta consulta, cree un índice en runtime y otro índice en year, en lugar de un índice compuesto:
db.movies.createIndex( { runtime: 1 } ), db.movies.createIndex( { year: 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 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.
El siguiente query es válido porque $or utiliza una cláusula geoespacial que no es near ($geoIntersects):
db.theaters.find( { $or: [ { "location.geo": { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ -74.5, 40.5 ], [ -73.5, 40.5 ], [ -73.5, 41.0 ], [ -74.5, 40.5 ] ] ] } } } }, { "location.address.state": "NY" } ] } )
[ { _id: ObjectId('59a47287cfa9a3a73e51e92f'), theaterId: 200, location: { address: { street1: '3124 Jericho Tpke', city: 'East Northport', state: 'NY', zipcode: '11731' }, geo: { type: 'Point', coordinates: [ -73.319092, 40.838463 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51ead6'), theaterId: 345, location: { address: { street1: '148 Walt Whitman Rd', city: 'Huntington Station', state: 'NY', zipcode: '11746' }, geo: { type: 'Point', coordinates: [ -73.410637, 40.825775 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eae8'), theaterId: 374, location: { address: { street1: '2478 Central Park Ave', city: 'Yonkers', state: 'NY', zipcode: '10710' }, geo: { type: 'Point', coordinates: [ -73.826805, 40.983246 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eafd'), theaterId: 384, location: { address: { street1: '40 Catherwood Road', city: 'Ithaca', state: 'NY', zipcode: '14850' }, geo: { type: 'Point', coordinates: [ -76.492142, 42.481991 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eb2c'), theaterId: 428, location: { address: { street1: '1 Crossgates Mall Rd', city: 'Albany', state: 'NY', zipcode: '12203' }, geo: { type: 'Point', coordinates: [ -73.848686, 42.690285 ] } } } ]
$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.
Esta query selecciona documentos en la colección movies donde year es 1903 o 1909:
db.movies.find( { year: { $in: [1903, 1909] } }, { _id: 0, title: 1, year: 1 } )
[ { title: 'The Great Train Robbery', year: 1903 }, { title: 'A Corner in Wheat', year: 1909 } ]
Cláusulas $or anidadas
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.