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 (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.

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