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
/ /

$and (query operador de predicado)

$and

$and realiza una AND operación lógica en una matriz de una o más expresiones y selecciona los documentos que satisfacen todas las expresiones.

Nota

MongoDB proporciona una operación implícita AND cuando se especifica una lista de expresiones separadas por comas.

Puedes usar $and 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.

$and tiene la siguiente sintaxis:

{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

Al evaluar las cláusulas en la expresión $and, el optimizador del query de MongoDB considera qué índices están disponibles que podrían ayudar a satisfacer las cláusulas de la expresión $and al seleccionar el mejor plan para ejecutar.

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

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

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 $and, puede generar un error si hay algún documento donde $x sea 0:

db.example.find( {
$and: [
{ x: { $ne: 0 } },
{ $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
]
} )

La mayoría de los lenguajes de programación y controladores, incluido el Shell de MongoDBmongosh (), no permiten la creación de objetos con claves duplicadas en el mismo nivel de objeto. Por ejemplo, si se especifican condiciones { $ne: "R", $ne: "PG" } como, el segundo valor sobrescribe al primero.

Para confirmar varias condiciones, utilice un AND explícito:

db.movies.find( {
$and: [
{ genres: { $in: [ "News", "Talk-Show" ] } },
{ genres: { $in: [ "History", "Western" ] } }
]},
{ title: 1, genres: 1, year: 1 }
)

La consulta anterior comprueba explícitamente que se cumplen ambas condiciones: el genres array debe incluir al menos un valor de cada $in conjunto.

Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación de MongoDB autogestionada, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.

$and Coincide con múltiples expresiones en el mismo campo.

Considere esta query:

db.movies.find(
{ $and: [ { year: { $gte: 1960 } }, { year: { $lte: 1970 } }, { directors: "Martin Scorsese" } ] },
{ title: 1, directors: 1, year: 1 })

La query selecciona todos los documentos de la colección movies donde:

  • el year es 1960 o posterior y

  • el year es 1970 o anterior y

  • Los directors incluyen a Martin Scorsese

También proyecta los resultados para que incluyan únicamente los campos title, directors y year. La consulta devuelve los siguientes documentos:

[
{
"_id": "573a1395f29313caabce2f95",
"title": "The Big Shave",
"directors": [ "Martin Scorsese" ],
"year": 1968
},
{
"_id": "573a1396f29313caabce3889",
"title": "Who's That Knocking at My Door",
"directors": [ "Martin Scorsese" ],
"year": 1967
}
]

Puedes simplificar esta consulta combinando los operadores para el campo year en un único objeto de consulta y utilizando operadores AND implícitos:

db.movies.find(
{ year: { $gte:1960, $lte:1970 }, directors:'Martin Scorsese' },
{ title: 1, directors: 1, year: 1 })

Siempre revise su consulta para confirmar que coincide con el comportamiento previsto. Usando el ejemplo anterior genres:

db.movies.find( { genres: { $in: [ "News", "Talk-Show" ], $in: [ "History", "Western" ] } } )

Para encontrar documentos donde la genres matriz contiene News Talk-Show History o y Western o,$in utilice:

db.movies.find( {
$and: [
{ genres: { $in: [ "News", "Talk-Show" ] } },
{ genres: { $in: [ "History", "Western" ] } }
]},
{ title: 1, genres: 1, year: 1 }
)

Si un campo es una matriz,directors: [ "Jack Conway", "Howard Hawks", "William A. Wellman" ] como, y desea comprobar si el documento contiene varios valores en lugar de uno,$all utilice:

db.movies.find( { directors: { $all: ['John Murray Anderson','Pèl Fejès'] } }, { title: 1, directors: 1, year: 1 })

La query anterior es semánticamente equivalente a AND, pero $all es más clara al consultar campos de arreglos.

Al igual que con los nombres de campo duplicados, las mismas consideraciones se aplican a los operadores duplicados utilizados en la query.

Volver

Lógica

En esta página