$and$andrealiza unaANDoperació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
ANDcuando se especifica una lista de expresiones separadas por comas.
Compatibilidad
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.
Sintaxis
$and tiene la siguiente sintaxis:
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
Comportamiento
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
$andcausara un error al evaluarse por sí sola, el$andque 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
$andpuede causar un error incluso si la primera expresión se evalúa comofalse.
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.
Ejemplos
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
yeares 1960 o posterior yel
yeares 1970 o anterior yLos
directorsincluyen 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.