Volver a la página principal
domingo 11 febrero 2024
3

Cómo realizar una operación de $lookup en MongoDB con múltiples campos locales

Introducción

En MongoDB, la operación de $lookup se utiliza para realizar una unión entre documentos de dos colecciones diferentes. Sin embargo, en ciertos casos, puede surgir la necesidad de realizar esta operación utilizando múltiples campos locales en lugar de solo uno. Este artículo te guiará a través del proceso de realizar una operación de $lookup en MongoDB con múltiples campos locales.

Escenario del problema

Imagina que tienes dos colecciones en tu base de datos MongoDB: 'estudiantes' y 'cursos'. Cada documento en la colección de estudiantes contiene referencias a múltiples cursos, y necesitas obtener los detalles de estos cursos mediante una operación de $lookup.

El desafío aquí radica en que la etapa $lookup típicamente espera un solo campo como localField, pero en este caso, tienes varios campos (course1, course2, course3, etc.) que deben considerarse.

Solución propuesta

Para superar este desafío, podemos aprovechar el poderoso framework de agregación de MongoDB y la etapa $lookup con un pipeline. La idea clave es construir dinámicamente un array que contenga los valores de todos los campos 'courseX' para cada documento de estudiante. Luego, podemos usar este array para realizar la operación de $lookup.

El proceso se puede dividir en los siguientes pasos:

1. Construcción del array de IDs de cursos: Creamos un array que contenga los valores de todos los campos 'courseX' para cada documento de estudiante utilizando operadores de agregación como $objectToArray, $filter y $reduce.

2. Realización de la operación $lookup: Una vez que tengamos el array de IDs de curso, lo utilizamos en la etapa $lookup dentro de un pipeline. Comparamos los IDs de curso del array con el campo _id de la colección de cursos.

Implementación

A continuación, se muestra la implementación de la solución utilizando el framework de agregación de MongoDB:

db.estudiantes.aggregate([
  {
    $lookup: {
      "from": "cursos",
      "let": {
        courses: {
          $reduce: {
            input: {
              $filter: {
                input: {
                  $objectToArray: "$ROOT"
                },
                cond: {
                  "$regexMatch": {
                    "input": "$this.k",
                    "regex": "^course[\d]$"
                  }
                }
              }
            },
            initialValue: [],
            in: {
              $concatArrays: [
                "$value",
                ["$this.v"]
              ]
            }
          }
        }
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $in: ["$_id", "$$courses"]
            }
          }
        }
      ],
      "as": "studentCourses"
    }
  }
])

Conclusión

Al aprovechar el framework de agregación de MongoDB y la etapa $lookup con pipelines, hemos abordado con éxito el desafío de realizar una operación de $lookup en MongoDB con múltiples campos locales. Esta solución proporciona flexibilidad y escalabilidad, lo que te permite vincular documentos entre colecciones en función de criterios dinámicos de manera eficiente.

Compartir:
Autor:
User photo

Jorge García

Fullstack developer