Definição
$matchFiltra documentos com base em umpredicado de consulta especificado. Os documentos correspondentes são passados para a próxima etapa do pipeline.
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
{ $match: { <query predicate> } }
A sintaxe do predicado de query $match é idêntica à sintaxe usada no argumento de query de um comando find().
Comportamento
Otimização de pipeline
Coloque
$matcho mais cedo possível no pipeline de agregação. Como o$matchlimita o número total de documento no pipe de agregação, as operações$matchanteriores minimizam a quantidade de processamento no pipe.Se você colocar
$matchno 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
$matchretorna um valor0,nulloufalsenesse documento.O predicado de query
$matchutiliza um campo ausente desse documento.
Restrições
Você não pode usar
$whereem um estágio$match.Você não pode usar
$nearou$nearSphereem um estágio$match. Como alternativa, você pode:Usar o operador de predicado de query
$geoWithincom$centerou$centerSphereno estágio$match.
Para usar
$textem um estágio$match, o estágio$matchdeve ser o primeiro estágio do pipeline.As visualizações não suportam
$text.Observação
$textfornece recursos de query de texto para sistemas autogerenciados (não Atlas). Para dados hospedados no MongoDB, o MongoDB também oferece uma solução de query de texto completo aprimorada, MongoDB Search.
Filtre dados no Atlas usando o MongoDB Search
Para dados armazenados no MongoDB Atlas, você pode usar a opção filter do MongoDB Search compound Operator para corresponder ou filtrar documentos ao executar $search queries. A execução de $match após $search é menos eficiente que a execução de $search com a opção de operador composto filter.
Para saber mais sobre a opção filter, consulte o operador 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:
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 }
Elementos da matriz de correspondência
Para filtrar documentos de uma collection ou estágio de agregação anterior com base em elementos em uma array, use o operador $elemMatch no predicado de query do estágio $match:
db.aggregate( [ { $documents: [ { student_id: 1, scores: [ 0.75, 0.65, 0.73 ] }, { student_id: 2, scores: [ 0.9, 0.88, 0.98 ] }, { student_id: 3, scores: [ 0.9, 0.84, 0.93 ] } ] }, { $match: { scores: { $elemMatch: { $gte: 0.9 } } } } ] )
[ { student_id: 2, scores: [ 0.9, 0.88, 0.98 ] }, { student_id: 3, scores: [ 0.9, 0.84, 0.93 ] } ]
Os exemplos de C# nesta página utilizam o banco de dados sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver MongoDB .NET/C#.
A seguinte classe Movie modela os documentos na collection sample_mflix.movies:
public class Movie { public ObjectId Id { get; set; } public int Runtime { get; set; } public string Title { get; set; } public string Rated { get; set; } public List<string> Genres { get; set; } public string Plot { get; set; } public ImdbData Imdb { get; set; } public int Year { get; set; } public int Index { get; set; } public string[] Comments { get; set; } [] public DateTime LastUpdated { get; set; } }
Observação
ConventionPack para Pascal Case
As classes C# nesta página usam Pascal case para seus nomes de propriedade, mas os nomes de campo na coleção MongoDB usam Camel case. Para considerar essa diferença, você pode usar o seguinte código para registrar um ConventionPack quando o aplicativo iniciar:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
Para usar o driver MongoDB .NET/C# para adicionar um estágio $match a um pipeline de agregação, chame o método Match() em um objeto PipelineDefinition.
O exemplo a seguir cria um estágio de pipeline que corresponde a todos os documentos Movie em que o campo Title é igual a "The Shawshank Redemption":
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(m => m.Title == "The Shawshank Redemption");
Os exemplos do Node.js nesta página utilizam o banco de dados do sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver do MongoDB Node.js
Para usar o driver Node.js do MongoDB para adicionar um estágio $match a um pipeline de agregação , use o operador $match em um objeto de pipeline.
O exemplo a seguir cria um estágio de pipeline que corresponde a todos os documentos movie em que o campo title é igual a "The Shawshank Redemption". O exemplo em seguida executa o pipeline de agregação:
const pipeline = [ { $match: { title: "The Shawshank Redemption" } } ]; const cursor = collection.aggregate(pipeline); return cursor;
Saiba mais
Consulte os Tutoriais do pipeline de agregação completo para obter mais informações e casos de uso sobre agregação.