Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$or (operador de predicado de consulta)

$or

$or realiza una OR operación lógica en una matriz de una o más expresiones y selecciona documentos que satisfacen al menos una de las expresiones.

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

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.

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

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 (que no sean de Atlas). Para los datos alojados en MongoDB, MongoDB también ofrece una solución mejorada de query de texto completo, MongoDB Search.

$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" }
]
} )

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.

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

Puedes anidar $or operaciones.

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.

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

Volver

$not

En esta página