Use Pipeline en el operador de búsqueda en MongoDB
- ¿Qué es la canalización de agregación?
-
¿Qué es el operador
$lookup
en MongoDB? -
Use Pipeline en el operador
$lookup
para unir condiciones en MongoDB
Este tutorial enseña cómo usar la canalización en el operador búsqueda
en MongoDB. Antes de continuar, es obligatorio tener suficiente conocimiento sobre la tubería de agregación y el operador $lookup
para comprender el uso de la tubería en el operador $lookup
al usar MongoDB.
Si ya conoce estos conceptos, puede pasar rápidamente a los dos últimos ejemplos de código de este tutorial.
¿Qué es la canalización de agregación?
Es un procedimiento de recopilación de datos y devolución de los resultados calculados. Este proceso recopila datos de diferentes documentos, los agrupa según condiciones específicas y realiza varios tipos de operaciones en los datos agrupados.
Por ejemplo, promedio, suma, máximo y mínimo. Es como las funciones de agregación de SQL.
En MongoDB, podemos usar la agregación de las siguientes tres formas.
-
Pipeline de agregación: contiene varias etapas para transformar los documentos proporcionados. Cada etapa acepta el conjunto de documentos y genera otro conjunto de documentos resultantes que luego pasan a la siguiente etapa, y este proceso continúa hasta la etapa final.
-
Función Map-reduce: utilizamos esta función para agregar resultados a gran escala. Tiene dos funciones,
mapear
yreducir
.El método
map
agrupa todos los documentos mientras que el métodoreduce
realiza operaciones sobre datos agrupados. -
Agregación de propósito único: la forma más simple de agregación utilizada para realizar tareas de agregación, pero carece de algunas funciones en comparación con el método de canalización de agregación. Usamos este tipo de agregación para realizar tareas dentro de un documento en particular, por ejemplo, contar los distintos valores dentro de un documento específico.
También puede leer esto para profundizar y conocer las canalizaciones de agregación.
¿Qué es el operador $lookup
en MongoDB?
Este operador se usa para realizar la combinación externa izquierda para fusionar datos de un documento a otro dentro de la misma base de datos. Filtra los documentos de una colección conjunta para su posterior procesamiento.
También podemos usar este operador para agregar un campo adicional a un documento existente.
El operador $lookup
agrega un nuevo atributo de matriz (campo) cuyos valores (elementos) coinciden con los documentos de la colección unida. Luego, estos documentos transformados pasan a la siguiente etapa.
El operador $lookup
tiene tres sintaxis diferentes que podemos usar teniendo en cuenta los requisitos del proyecto. Este tutorial utiliza la sintaxis $lookup
para Condiciones de unión y subconsultas en la colección unida
.
Para practicar con un código de ejemplo, preparemos las colecciones de muestra con datos.
Código de ejemplo:
db.createCollection('collection1');
db.createCollection('collection2');
db.collection1.insertMany([
{"shopId": "001", "shopPosId": "001", "description": "description for 001"},
{"shopId": "002", "description": "description for 002"},
{"shopId": "003", "shopPosId": "003", "description": "description for 003"},
{"shopId": "004", "description": "description for 004"}
]);
db.collection2.insertMany([
{"shopId": "001", "shopPosId": "0078", "clientUid": "474192"},
{"shopId": "002", "shopPosId": "0012", "clientUid": "474193"},
{"shopId": "003", "shopPosId": "0034", "clientUid": "474194"},
{"shopId": "004", "shopPosId": "0056", "clientUid": "474195"}
]);
Ahora, podemos ejecutar los siguientes comandos para ver los documentos insertados en cada colección.
db.collection1.find();
db.collection2.find();
Use Pipeline en el operador $lookup
para unir condiciones en MongoDB
Para aprender a usar la canalización en el operador $lookup
, unamos documentos de dos colecciones en las que collection1.shopId
es igual a collection2.shopId
, y collection1
no contiene el campo shopPosId
.
Sólo se unirán aquellos documentos de ambas colecciones que cumplan ambas condiciones. Consulte el código de ejemplo que se proporciona a continuación.
Código de ejemplo:
db.collection2.aggregate([
{
"$lookup": {
"from": "collection1",
"let": { "shopId": "$shopId" },
"pipeline": [{
"$match": {
"$and": [
{"$expr": {"$eq": ['$shopId', '$$shopId'] }},
{ "shopPosId": { "$exists": false } }
]
}
}],
"as": "shopDescription"
}
}
]).pretty();
Producción:
¿Observó cuidadosamente el resultado dado arriba? Solo se unen aquellos documentos de ambas colecciones que cumplen ambas condiciones en el pipeline (la collection1.shopId
es igual a la collection2.shopId
, y la collection1
no contiene el campo shopPosId
).
Además, aquellos documentos que no cumplen estas condiciones tienen una matriz vacía llamada shopDescription
(ver los cuadros rojos en los resultados anteriores). Podemos mostrar solo aquellos documentos resultantes que contengan una matriz shopDescription
no vacía (consulte la siguiente consulta).
Código de ejemplo:
db.collection2.aggregate([
{
"$lookup": {
"from": "collection1",
"let": { "shopId": "$shopId" },
"pipeline": [{
"$match": {
"$and": [
{"$expr": {"$eq": ['$shopId', '$$shopId'] }},
{ "shopPosId": { "$exists": false } }
]
}
}],
"as": "shopDescription"
}
},
{
"$match":{
"shopDescription": { $exists: true, $not: {$size: 0} }
}
}
]).pretty();
Producción: