Definición
$matchFiltra documentos según un criterio específico. Predicado de consulta. Los documentos coincidentes se pasan a la siguiente etapa del pipeline.
Compatibilidad
Puedes usar $match para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
{ $match: { <query predicate> } }
La sintaxis del predicado de query $match es idéntica a la sintaxis utilizada en el argumento query de un comando find().
Comportamiento
Optimización del pipeline
Coloqcar el
$matchlo más temprano posible en el pipeline de agregación. Debido a que$matchlimita el número total de documentos en el pipeline de agregación, las operaciones anteriores$matchminimizan la cantidad de procesamiento posterior.Si colocas un
$matchal principio de un pipeline, el query puede aprovechar los índices como cualquier otrodb.collection.find()odb.collection.findOne().
Expresiones en predicados de query
Para incluir expresiones en un predicado de query, utiliza el operador $expr.
0, valores nulos, falsos o faltantes
Una etapa $match filtra un documento de los resultados del pipeline si se aplica una de las siguientes condiciones:
El predicado de query
$matchdevuelve un valor0,nullofalseen ese documento.El predicado de query
$matchutiliza un campo que falta en ese documento.
Restricciones
No puedes usar
$whereen una etapa$match.No puede usar
$nearni$nearSphereen una etapa$match. Como alternativa, puede elegir entre:Utiliza el operador de predicado de query
$geoWithincon$centero$centerSphereen la etapa$match.
Para usar
$texten una etapa$match, la etapa$matchdebe ser la primera etapa de la pipeline.Las vistas no son compatibles con
$text.Nota
$textProporciona funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de consulta de texto completo: Atlas Search.
Filtrar datos en Atlas mediante la búsqueda en Atlas
Para los datos almacenados en MongoDB Atlas, puede usar la opción del operador compuesto filter de búsqueda en Atlas para buscar coincidencias o filtrar documentos al ejecutar consultas$search. Ejecutar$matchdespués de$searchtiene menor rendimiento que ejecutar$searchcon la opción del operador compuesto filter.
Para obtener más información sobre la opción filter, consulta operador compuesto en la documentación de Atlas.
Ejemplos
Los ejemplos utilizan una colección llamada articles con los siguientes 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 }
Coincidencia exacta
La siguiente operación utiliza $match para realizar una coincidencia exacta:
db.articles.aggregate( [ { $match : { author : "dave" } } ] );
El $match selecciona los documentos donde el campo author es igual a dave, y la agregación devuelve lo siguiente:
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 } { "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
Realizar un recuento
El siguiente ejemplo selecciona documentos para procesar utilizando el operador de pipeline $match y luego canaliza los resultados al operador de pipeline $group para calcular un conteo del documento:
db.articles.aggregate( [ { $match: { $or: [ { score: { $gt: 70, $lt: 90 } }, { views: { $gte: 1000 } } ] } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
En el pipeline de agregación, $match selecciona los documentos donde el score es mayor que 70 y menor que 90, o el views es mayor o igual que 1000. Estos documentos se canalizan al $group para realizar un conteo. La agregación devuelve lo siguiente:
{ "_id" : null, "count" : 5 }
Coincidir con elementos de arreglo
Para filtrar documentos de una colección o una etapa de agregación anterior basándose en los elementos de un arreglo, utiliza el operador $elemMatch en el predicado de query de la etapa $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 ] } ]
Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.
La siguiente clase Movie modela los documentos en la colección 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; } }
Nota
ConventionPack para Pascal Case
Las clases de C# en esta página utilizan Pascal case para los nombres de sus propiedades, pero los nombres de los campos en la colección de MongoDB utilizan camel case. Para tener en cuenta esta diferencia, se puede usar el siguiente código para registrar un ConventionPack cuando la aplicación se inicie:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
Para usar el controlador MongoDB.NET/C# para agregar una $match etapa a una canalización de agregación, llame a Match()método en un PipelineDefinition objeto.
El siguiente ejemplo crea una plataforma del pipeline que coincide con todos los documentos Movie donde el campo Title es igual a "The Shawshank Redemption":
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(m => m.Title == "The Shawshank Redemption");
Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.
Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $match a una canalización de agregación, utilice el Operador $match en un objeto de canalización.
El siguiente ejemplo crea una plataforma de pipeline que coincide con todos los documentos movie donde el campo title es igual a "The Shawshank Redemption". A continuación, el ejemplo ejecuta el pipeline de agregación:
const pipeline = [ { $match: { title: "The Shawshank Redemption" } } ]; const cursor = collection.aggregate(pipeline); return cursor;
Obtén más información
Consulta los Tutoriales completos del pipeline de agregación para obtener más información y casos de uso sobre agregación.