Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Menu Docs
Página inicial do Docs
/ /

$and (operador de predicado da query)

$and

$and executa uma operação lógica AND 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 separadas 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 permitem a construção de objetos com chaves duplicadas no mesmo nível de objeto . Por exemplo, se você especificar condições { $ne: "R", $ne: "PG" } como, o segundo valor substituirá o primeiro.

Para confirmar múltiplas condições, utilize um AND explícito:

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

A query anterior verifica explicitamente se ambas as condições estão satisfeitas: a genres array deve incluir pelo menos um valor de cada $in conjunto.

Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.

$and corresponde a várias expressões no mesmo campo.

Considere esta query:

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

A query seleciona todos os documentos na collection movies onde:

  • o year é 1960 ou posterior e

  • o year é 1970 ou anterior e

  • o directors incluiMartin Scorsese

Ele também projeta os resultados para incluir somente os campos title, directors e year. A query retorna os seguintes 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
}
]

Você pode simplificar essa query combinando os operadores do campo year em um único objeto de query e usando operadores AND implícitos:

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

Sempre revise sua query para confirmar que ela corresponde ao comportamento pretendido. Usando o exemplo genres anterior :

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

Para localizar documentos onde o genres array contém News ou Talk-Show e History ou Western ou,$in utilize:

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

Se um campo for uma array,directors: [ "Jack Conway", "Howard Hawks", "William A. Wellman" ] como, e você quiser verificar se o documento contém vários valores em vez de um,$all use:

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

A query anterior é semanticamente equivalente a AND, mas $all é mais clara ao consultar campos de 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