Docs Menu
Docs Home
/ /

$and

$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 AND implícita 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 MongoDB Shell (mongosh), no permiten la construcción de objetos con claves duplicadas en el mismo nivel de objeto. Por ejemplo:

db.inventory.find( { price: { $in: [ 7.99, 3.99 ], $in: [ 4.99, 1.99 ] } } )

La query anterior no es válida porque el nombre del campo price tiene operadores duplicados en el mismo nivel de objeto. La query enviada al servidor difiere de la intención. Para que la query funcione, utiliza un AND explícito:

db.inventory.find( {
$and: [
{ price: { $in: [ 7.99, 3.99 ] } },
{ price: { $in: [ 4.99, 1.99 ] } }
]
} )

La consulta anterior comprueba explícitamente que se cumplan ambas condiciones: la price matriz debe incluir al menos un valor de cada conjunto. Para más información,$in consulte Ejemplos.

Los ejemplos coinciden con múltiples expresiones en el mismo campo.

Considere esta query:

db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )

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

  • el valor del campo price no es igual a 1.99 y

  • El campo price existe.

Puede simplificar esta query al combinar las expresiones de operador del campo price en un único objeto de query con un AND implícito anidado:

db.inventory.find( { price: { $ne: 1.99, $exists: true } } )

Las reescrituras no siempre son posibles, sobre todo cuando existen condiciones duplicadas en el mismo campo. Por ejemplo:

db.inventory.find( { status: { $ne: "closed", $ne: "archived" } } )

La consulta anterior no es válida porque usa más de una vez en $ne el status campo del mismo nivel de objeto. Use en su $nin lugar:

db.inventory.find( { status: { $nin: [ "closed", "archived" ] } } )

Reescribe la consulta según tu intención. Considera esta consulta:

db.inventory.find( {
$and: [
{ status: "new" },
{ status: "processing" }
]
} )

Para buscar documentos donde status sea new processingo,$in utilice:

db.inventory.find( { status: { $in: [ "new", "processing" ] } } )

Si su status campo es una matriz [ "new", "processing" ] y desea verificar si el documento contiene new processingy,$all use:

db.inventory.find( { status: { $all: [ "new", "processing" ] } } )

La consulta anterior es semánticamente equivalente AND a, pero es más claro cuando se consultan campos de $all matriz.

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