Use Pipeline en el operador de búsqueda en MongoDB

Mehvish Ashiq 15 febrero 2024
  1. ¿Qué es la canalización de agregación?
  2. ¿Qué es el operador $lookup en MongoDB?
  3. Use Pipeline en el operador $lookup para unir condiciones en MongoDB
Use Pipeline en el operador de búsqueda 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.

  1. 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.

  2. Función Map-reduce: utilizamos esta función para agregar resultados a gran escala. Tiene dos funciones, mapear y reducir.

    El método map agrupa todos los documentos mientras que el método reduce realiza operaciones sobre datos agrupados.

  3. 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:

usar canalización en el operador de búsqueda en mongodb - salida 1

¿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:

usar canalización en el operador de búsqueda en mongodb - salida2

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook