$and
$and
executa uma operaçãoAND
lógica em uma array de uma ou mais expressões (<expression1>
,<expression2>
e assim por diante) e seleciona os documentos que satisfazem todas as expressões.Observação
O MongoDB fornece uma operação
AND
implícita ao especificar uma lista de expressões separada por vírgula.
Compatibilidade
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
Sintaxe
O $and
tem a seguinte sintaxe:
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
Comportamento
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 parafalse
.
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 ] } } ] } )
Exemplos
$and queries com várias expressões especificando o 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 a1.99
eo campo
price
existe.
A query pode ser reescrita com uma operação AND
implícita que combina as expressões do operador para o campo price
:
db.inventory.find( { price: { $ne: 1.99, $exists: true } } )
$and com várias expressões especificando o mesmo operador
Considere esta query:
db.inventory.find( { $and: [ { $or: [ { qty: { $lt : 10 } }, { qty : { $gt: 50 } } ] }, { $or: [ { sale: true }, { price : { $lt : 5 } } ] } ] } )
A query seleciona todos os documentos onde:
o valor do campo
qty
é inferior a10
ou superior a50
eo valor do campo
sale
é igual atrue
ou o valor do campoprice
é menor que5
.
A query não pode usar uma operação AND
implícita porque usa o operador $or
mais de uma vez.
$and com várias condições no mesmo campo
Considere o seguinte documento de amostra armazenado na coleção inventory
:
db.inventory.insertOne( { "tags": [ "home" ] } )
Quando você especifica várias condições no mesmo campo no mesmo nível do objeto de query, somente a última condição é considerada.
db.inventory.find( { tags: { $in: [ "electronics" ] }, tags: { $in: [ "home" ] } } );
[ { "_id": ObjectId( "..." ), "tags": [ "home" ] } ]
Na query acima:
A condição
{ tags: { $in: [ "electronics" ] } }
é ignorada.A condição
{ tags: { $in: [ "home" ] } }
é aplicada e executada.
Para verificar home
e electronics
simultaneamente, use uma operação $and
explícita:
db.inventory.find( { $and: [ { tags: { $in: [ "home" ] } }, { tags: { $in: [ "electronics" ] } } ] } );
[]
Como o operador $and
exige que ambas as condições sejam verdadeiras, nenhum documento corresponde e a query não retorna nenhum resultado.