Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$or (operador de predicado de consulta)

$or

La $or El operador realiza una operación lógica OR en una matriz de uno o más <expressions> y selecciona los documentos que cumplen al menos una de las <expressions>.

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.

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 runtime es mayor que 1000.

  • El valor del campo year es anterior a 1910.

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 } ),

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 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
]
}
}
}
]

Al ejecutar queries $or con sort(), MongoDB puede usar índices que admitan las cláusulas $or.

Puede crear índices parciales con $or. Utilice partialFilterExpression del método db.collection.createIndex() para crear un índice parcial.

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 }
]

Puede anidar operaciones $or.

Tip

Para permitir que el motor de queries las optimice, $or gestiona los errores de la siguiente manera:

  • Si alguna expresión suministrada a $or causara un error al evaluarse por sí sola, el $or que 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 $or puede causar un error incluso si la primera expresión se evalúa como true.

Volver

$not

En esta página