Menu Docs
Página inicial do Docs
/ /

$and

$and

$and executa uma AND operação lógica em uma array de uma ou mais expressões e seleciona os documentos que satisfazem todas as expressões.

Observação

O MongoDB fornece uma operação AND implícita quando você especifica uma lista de expressões separada por vírgula.

Você pode utilizar o $and para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

O $and tem a seguinte sintaxe:

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

Ao avaliar as cláusulas na expressão $and, o otimizador de query do MongoDB considera quais índices estão disponíveis que podem ajudar a satisfazer as cláusulas da expressão $and ao selecionar o melhor plano para executar.

Para permitir que o mecanismo de consulta otimize as consultas, o $and lida com erros como segue:

  • Se qualquer expressão fornecida para $and causar um erro quando avaliada sozinha, o $and contendo a expressão pode causar um erro, mas um erro não é garantido.

  • Uma expressão fornecida após a primeira expressão fornecida para $and pode causar um erro mesmo se a primeira expressão avaliar para false.

Por exemplo, a seguinte consulta sempre produz um erro se $x for 0:

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

A consulta a seguir, que contém várias expressões fornecidas para $and, pode gerar um erro se houver algum documento em que $x seja 0:

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

A maioria das linguagens de programação e drivers, incluindo o MongoDB Shell (mongosh), não permite a criação de objetos com chaves duplicadas no mesmo nível de objeto. Por exemplo:

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

A query anterior é inválida porque o nome do campo price tem operadores duplicados no mesmo nível de objeto . A query enviada ao servidor é diferente da intenção. Para fazer a query funcionar, use um AND explícito:

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

A query anterior verifica explicitamente se ambas as condições estão satisfeitas: a price array deve incluir pelo menos um valor de cada conjunto. Para obter mais informações,$in consulte Exemplos.

Os exemplos correspondem a várias expressões no mesmo campo.

Considere esta query:

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

A query seleciona todos os documentos na collection inventory onde:

  • o valor do campo price não é igual a 1.99 e

  • o campo price existe.

Você pode simplificar esta query combinando as expressões de operador para o campo price em um único objeto de query com um AND implícito aninhado:

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

As reescritas nem sempre são possíveis, especialmente quando existem condições duplicadas no mesmo campo. Por exemplo:

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

A query anterior é inválida porque usa mais de uma vez $ne no status campo no mesmo nível de objeto . Em $nin vez disso, use:

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

Reescreva a query com base na sua intenção. Considere esta query:

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

Para localizar documentos onde status é new processingou,$in use:

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

Se o seu status campo for uma array [ "new", "processing" ] e você quiser verificar se o documento contém new processinge,$all use:

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

A query anterior é semanticamente equivalente AND a, mas é mais clara ao queryr campos de $all array.

Semelhante aos nomes de campo duplicados, as mesmas considerações se aplicam para operadores duplicados usados na query.

Voltar

Lógica

Nesta página