MongoDB es una popular base de datos NoSQL que almacena datos en colecciones. Las colecciones de MongoDB se componen de uno o más documentos que contienen los datos reales en formato JSON. Los documentos son comparables a las filas de las bases de datos relacionales SQL tradicionales, mientras que las colecciones son análogas a las tablas.
Una funcionalidad clave en las bases de datos es la capacidad de consultar los datos almacenados en la base. La consulta de datos permite la recuperación de información específica, el análisis de datos, la elaboración de informes de datos y también la integración de datos.
Para poder consultar una base de datos de forma eficaz, es crucial poder combinar datos de varias tablas, en el caso de las bases de datos SQL o de varias colecciones en las bases de datos NOSQL, en un único conjunto de resultados.
En MongoDB $lookup permite a los usuarios combinar información de dos colecciones al realizar una consulta. Realiza el equivalente a una unión externa izquierda en una base de datos SQL.
uso y objetivo de $lookup
Una función importante de las bases de datos es el procesamiento de datos para obtener información significativa a partir de datos sin procesar.
Por ejemplo, si dirige un negocio de restauración, es posible que desee analizar los datos de su restaurante para averiguar cuánto gana cada día, qué comidas se demandan los fines de semana o incluso averiguar cuántas tazas de café vende a cada hora del día.
Para tales necesidades, las simples consultas a la base de datos no serán suficientes. Necesita realizar consultas avanzadas sobre los datos que tiene almacenados. Para dar respuesta a estas necesidades, MongoDB cuenta con una función denominada canalización de agregación.
Una canalización de agregación es un sistema formado por operaciones componibles denominadas etapas, que se utilizan para procesar datos con el fin de producir un resultado agregado final. Algunos ejemplos de etapas en la canalización de agregación son $sort, $match, $group, $merge, $count y $lookup, entre otras.
Estas etapas pueden aplicarse en cualquier orden en una canalización de agregación. En cada etapa de una canalización de agregación, se realizan diferentes operaciones sobre los datos que pasan por la canalización de agregación.

así,1TP4Búsqueda es una etapa en la canalización de agregación de MongoDB. $Lookup se utiliza para realizar una unión externa izquierda entre dos colecciones en una base de datos MongoDB. Una unión exterior izquierda combina todos los documentos o entradas de la izquierda con documentos o entradas coincidentes de la derecha.
Por ejemplo, considere las dos colecciones siguientes, que se han representado en formato tabular para facilitar su comprensión:
colección_pedidos:
pedido_id | customer_id | fecha_pedido | importe_total |
---|---|---|---|
1 | 100 | 2022-05-01 | 50.00 |
2 | 101 | 2022-05-02 | 75.00 |
3 | 102 | 2022-05-03 | 100.00 |
colección_clientes:
numero_cliente | nombre_cliente | correo_cliente | teléfono_cliente |
---|---|---|---|
100 | Juan Pérez | john@example.com | 555-1234 |
102 | Jane Smith | jane@example.com | 555-5678 |
Si realizamos una unión externa izquierda en las colecciones anteriores utilizando el campo customer_idque aparece en la colección coleccion_pedidos, siendo la colección coleccion_pedidos la colección izquierda y la colección colección_clientes la colección derecha, el resultado contendrá todos los documentos de la colección pedidos y los documentos de la colección clientes que tengan un número_cliente que coincidió con un customer_id de cualquiera de los registros de la colección pedidos.
El resultado final de la operación de unión externa izquierda en las colecciones de pedidos y clientes tiene el siguiente aspecto cuando se representa en formato tabular:

Observe que para el cliente con customer_id 101 en la colección Pedidos, que no tenía un valor número_cliente coincidente en la colección Clientes, los valores correspondientes que faltaban en la tabla de clientes se han rellenado con null.
1TP4Búsqueda realiza una comparación de igualdad estricta entre los campos y recupera todo el documento coincidente, y no sólo los campos coincidentes.
sintaxis de $lookup
La sintaxis de 1TP4Búsqueda es la siguiente:
{
$lookup:
{
from: <colección a unir>,
localField: <campo de los documentos de entrada>,
foreignField: <campo de los documentos de la colección "from">,
as: <campo de la matriz de salida>
}
}
1TP4Búsqueda tiene cuatro parámetros
- de - representa la colección desde la que queremos buscar los documentos. En nuestro ejemplo anterior utilizando pedidos_recogida y colección_clientes, pondríamos colección_clientes como de de la colección.
- localField - es un campo de la colección de trabajo o primaria que utilizamos para comparar con los campos de nuestra colección de(colección_clientes en nuestro caso). En el ejemplo anterior, el localField sería customer_id que se encuentra en la colección pedidos_recogida.
- campoExtranjero - es el campo con el que queremos comparar en la colección que especificamos en de. En nuestro ejemplo, sería número_cliente que se encuentra en la colección colección_clientes y que utilizamos como valor en de
- como - se trata de un nuevo nombre de campo que especificamos para representar el campo que aparecerá en nuestro documento, que contiene los documentos resultantes de las coincidencias entre el localField y el foreignField. Todas estas coincidencias se colocan en una matriz en este campo. Si no hay coincidencias, este campo contendrá una matriz vacía.
A partir de nuestras dos colecciones anteriores, utilizaríamos el siguiente código para realizar una operación 1TP20Buscar en las dos colecciones con la colección pedidos_como nuestra colección de trabajo o primaria.
{
$lookup: {
from: "customers_collection",
localField: "customer_id",
foreignField: "customer_num",
as: "customer_info"
}
Tenga en cuenta que el campo como puede ser cualquier valor de cadena. Sin embargo, si le da un nombre que ya existe en el documento de trabajo, ese campo se sobrescribirá.
Unir datos de varias colecciones
MongoDB 1TP4Búsqueda es una etapa útil en una canalización de agregación en MongoDB. Aunque no es un requisito que una canalización de agregación en MongoDB deba tener una etapa 1TP4Búsqueda , la etapa es crucial cuando se realizan consultas complejas que requieren unir datos de múltiples colecciones.
La etapa 1TP4Búsqueda realiza una unión exterior izquierda en dos colecciones que tiene como resultado la creación de un nuevo campo o la sobreescritura de los valores de un campo existente con una matriz que contiene documentos de otra colección.
Estos documentos se seleccionan en función de si tienen valores que coinciden con los del campo con el que se comparan. El resultado final es un campo que contiene una matriz de documentos en caso de que se hayan encontrado coincidencias o una matriz vacía en caso de que no se hayan encontrado coincidencias.
Consideremos las colecciones de empleados y proyectos que se muestran a continuación.

Podemos utilizar el código siguiente para unir las dos colecciones:
db.projects.aggregate([
{
$lookup: {
from: "empleados",
localField: "empleados",
foreignField: "_id",
as: "empleados_asignados"
}
}
])
El resultado de esta operación es una combinación de las dos colecciones. El resultado son los proyectos y todos los empleados asignados a cada proyecto. Los empleados se representan en un array.

Etapas del pipeline que se pueden utilizar junto con $lookup
Como ya se ha mencionado, 1TP4Búsqueda es una etapa de una canalización de agregación de MongoDB, y puede utilizarse junto con otras etapas de canalización de agregación. Para mostrar cómo pueden utilizarse estas etapas junto con 1TP4Búsqueda, utilizaremos las dos colecciones siguientes con fines ilustrativos.

En MongoDB, se almacenan en formato JSON. Este es el aspecto de las colecciones anteriores en MongoDB.

Algunos ejemplos de etapas de canalización de agregación que se pueden utilizar junto con 1TP4Búsqueda incluyen:
$match
$match es una etapa de canalización de agregación que se utiliza para filtrar el flujo de documentos y permitir que sólo aquellos documentos que cumplan la condición dada pasen a la siguiente etapa de la canalización de agregación. Esta etapa se utiliza mejor al principio de la canalización para eliminar los documentos que no se van a necesitar y optimizar así la canalización de agregación.
Utilizando las dos colecciones anteriores, puede combinar $match y 1TP4Búsqueda de la siguiente manera
db.users.aggregate([
{
$match: {
país: "USA"
}
},
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "user_id",
as: "pedidos"
}
}
])
$match se utiliza para filtrar los usuarios de EE.UU.. A continuación, el resultado de $match se combina con 1TP4Búsqueda para obtener los detalles de los pedidos de los usuarios de EE.UU.. El resultado de la operación anterior se muestra a continuación:

$proyecto
Proyecto $ es una etapa utilizada para remodelar documentos especificando qué campos incluir, excluir o añadir a los documentos. Por ejemplo, en caso de que esté procesando documentos con diez campos cada uno, pero sólo cuatro campos de los documentos contienen datos que necesita para su procesamiento de datos, puede utilizar Proyecto $ para filtrar fuera los campos que no necesita.
Esto le permite evitar el envío de datos innecesarios a la siguiente etapa de su canalización de agregación.
Podemos combinar $lookup y $project de la siguiente manera
db.users.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "user_id",
as: "orders"
}
},
{
$project: {
nombre: 1,
_id: 0,
total_gastado: { $suma: "$pedidos.precio" }
}
}
])
Lo anterior combina las colecciones de usuarios y pedidos utilizando $lookup, luego $project se utiliza para mostrar sólo el nombre de cada usuario y la cantidad gastada por cada usuario. $project también se utiliza para eliminar el campo _id de los resultados. El resultado de la operación anterior se muestra a continuación:

$unwind
$unwind es una etapa de agregación que se utiliza para deconstruir o desenrollar un campo de matriz creando nuevos documentos para cada elemento de la matriz. Esto es útil en caso de que desee ejecutar alguna agregación sobre los valores del campo del array.
Por ejemplo, en el ejemplo siguiente, en caso de que quiera ejecutar una agregación sobre el campo aficiones, no podrá hacerlo porque se trata de un array. Sin embargo, puede desenrollarlo utilizando $unwind y luego realizar agregaciones sobre los documentos resultantes.

Utilizando las colecciones users y orders, podemos utilizar $lookup y $unwind conjuntamente de la siguiente manera
db.users.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "user_id",
as: "orders"
}
},
{
$unwind: "$órdenes"
}
])
En el código anterior, $lookup devolve un campo de matriz llamado pedidos. a continuación se utiliza $unwind para desenrollar el campo de matriz. El resultado de esta operación se muestra a continuación: Observe que Alice aparece dos veces porque tenía dos pedidos.

Ejemplos de casos de uso de $lookup
Al realizar el procesamiento de datos, 1TP4Búsqueda es una herramienta útil. Por ejemplo, puede tener dos colecciones que desee unir basándose en campos de las colecciones que tengan datos similares. Para ello puede utilizar una simple etapa $lookup y añadir un nuevo campo en las colecciones primarias, que contienen documentos obtenidos de otra colección.
Considere las colecciones usuarios y pedidos que se muestran a continuación:

Las dos colecciones pueden combinarse utilizando $lookup para obtener el resultado que se muestra a continuación:

1TP4Búsqueda también puede utilizarse para realizar uniones más complejas. 1TP4Búsqueda no se limita a realizar uniones en dos colecciones. Puede implementar múltiples etapas 1TP4Búsqueda para realizar uniones en más de dos colecciones. Considere las tres colecciones que se muestran a continuación:

Podemos utilizar el código siguiente para realizar una unión más compleja a través de las tres colecciones para obtener todos los pedidos que se realizaron y también los detalles de los productos que se pidieron.
El código siguiente nos permite hacer precisamente eso:
db.orders.aggregate([
{
$lookup: {
from: "order_items",
localField: "_id",
foreignField: "order_id",
as: "order_items"
}
},
{
$unwind: "$order_items"
},
{
$lookup: {
from: "products",
localField: "order_items.product_id",
foreignField: "_id",
as: "product_details"
}
},
{
$group: {
_id: "$_id",
cliente: { $first: "$customer" },
total: { $sum: "$order_items.price" },
products: { $push: "$detalles_producto" }
}
}
])
A continuación se muestra el resultado de la operación anterior:

Conclusión
Cuando se realiza un procesamiento de datos que implica múltiples colecciones, $lookup puede ser útil ya que permite unir datos y sacar conclusiones basadas en datos almacenados en múltiples colecciones. El procesamiento de datos rara vez se basa en una sola colección.
Para extraer conclusiones significativas de los datos, unir datos de varias colecciones es un paso clave. Por lo tanto, considere la posibilidad de utilizar la etapa $lookup en su canalización de agregación de MongoDB para permitirle procesar mejor sus datos y extraer conclusiones significativas de los datos brutos almacenados en varias colecciones.
También puede explorar algunos comandos y consultas de MongoDB.