$match (agregação)
Nesta página
Definição
Compatibilidade
Você pode utilizar o $match
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 estágio $match
tem a seguinte forma de protótipo:
{ $match: { <query> } }
$match
pega um documento que especifica as condições da query. A sintaxe da query é idêntica à sintaxe da query somente de leitura; ou seja, $match
não aceita expressões de agregação bruta. Em vez disso, use uma expressão query $expr
para incluir a expressão de agregação em $match
.
Comportamento
Otimização de pipeline
Coloque
$match
o mais cedo possível no pipeline de agregação. Como o$match
limita o número total de documento no pipe de agregação, as operações$match
anteriores minimizam a quantidade de processamento no pipe.Se você colocar
$match
no início de um pipeline, a query poderá aproveitar os índices como qualquer outrodb.collection.find()
oudb.collection.findOne()
.
Expressões em predicados de query
Para incluir expressões em um predicado de query, use o operador $expr
.
0, valores nulos, falsos ou ausentes
Um estágio $match
filtra um documento dos resultados do pipeline se uma das seguintes condições se aplicar:
O predicado de query
$match
retorna um valor0
,null
oufalse
nesse documento.O predicado de query
$match
utiliza um campo ausente desse documento.
Restrições
A sintaxe de query
$match
é idêntica à sintaxe de query de operação de leitura; ou seja,$match
não aceita expressões brutas de agregação. Para incluir a expressão de agregação em$match
, use uma expressão de query$expr
:{ $match: { $expr: { <aggregation expression> } } } Não é possível usar
$where
em queries$match
como parte do pipeline de agregação.Não é possível usar
$near
nem$nearSphere
em queries$match
como parte do pipeline de agregação. Como alternativa, você pode:Use o operador de query
$geoWithin
com$center
ou$centerSphere
no estágio$match
.
Para usar
$text
no estágio$match
, o estágio$match
deve ser o primeiro estágio do pipeline.As visualizações não suportam
$text
.Observação
$text
fornece recursos de query de texto para implantações autogerenciadas (não Atlas). Para dados hospedados no MongoDB Atlas, o MongoDB oferece uma solução aprimorada de query de texto completo, Atlas Search.
Filtrar dados no Atlas usando o Atlas Search
Em dados armazenados no MongoDB Atlas, você pode usar a opção do operador composto filter
do Atlas Search para encontrar correspondentes ou filtrar documentos ao executar queries $search
. Executar $match
primeiro e $search
depois é menos eficiente do que executar $search
com a opção filter
de operador composto.
Para saber mais sobre a opção filter
, consulte composto na documentação do Atlas.
Exemplos
Os exemplos utilizam uma collection chamada articles
com os seguintes documentos:
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 } { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 } { "_id" : ObjectId("55f5a192d4bede9ac365b257"), "author" : "ahn", "score" : 60, "views" : 1000 } { "_id" : ObjectId("55f5a192d4bede9ac365b258"), "author" : "li", "score" : 55, "views" : 5000 } { "_id" : ObjectId("55f5a1d3d4bede9ac365b259"), "author" : "annT", "score" : 60, "views" : 50 } { "_id" : ObjectId("55f5a1d3d4bede9ac365b25a"), "author" : "li", "score" : 94, "views" : 999 } { "_id" : ObjectId("55f5a1d3d4bede9ac365b25b"), "author" : "ty", "score" : 95, "views" : 1000 }
Correspondência de qualidade
A operação a seguir usa $match
para realizar uma correspondência de igualdade simples:
db.articles.aggregate( [ { $match : { author : "dave" } } ] );
O $match
seleciona os documentos em que o campo author
é igual a dave
, e a agregação retorna o seguinte:
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 } { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
Fazer uma contagem
O exemplo a seguir seleciona documentos a serem processados usando o operador de pipeline $match
e, em seguida, encaminha os resultados para o operador de pipeline $group
para calcular a contagem dos documentos:
db.articles.aggregate( [ { $match: { $or: [ { score: { $gt: 70, $lt: 90 } }, { views: { $gte: 1000 } } ] } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
No pipeline de agregação, $match
seleciona os documentos em que score
é maior que 70
e menor que 90
ou em que views
é maior ou igual que 1000
. Esses documentos são então encaminhados para $group
para a realização da contagem. A agregação retorna o seguinte:
{ "_id" : null, "count" : 5 }