combina documentos de otra colección y añade las coincidencias como un array. Permite resolver relaciones durante una aggregation, pero no crea integridad referencial ni elimina el coste de consultar y transferir datos de ambas colecciones.
Cuando los datos relacionados viven en colecciones independientes, una lectura puede necesitar composición. Las alternativas son:
múltiples queries desde la aplicación;
batching con $in;
cache o duplicación parcial;
$lookup dentro del servidor.
$lookup es útil cuando la relación y el volumen justifican una pipeline, especialmente para reportes, administración o respuestas que deben combinar varios conjuntos.
cada documento local
→ busca coincidencias extranjeras
→ recibe un array
→ continúa la pipeline
La cardinalidad del documento local no cambia hasta que se aplica $unwind. Sin embargo, el tamaño del documento de salida puede aumentar mucho si hay muchas coincidencias.
let define variables del documento local y $expr las utiliza. El soporte de índices dentro de expresiones tiene condiciones y limitaciones; verifica el plan real.
Si una relación se consulta en casi todos los hot paths y tiene ownership y crecimiento acotados, depender siempre de lookup puede indicar un boundary demasiado normalizado.
Si la entidad es independiente, cambia con frecuencia o tiene cardinalidad alta, referencing y lookup ocasional pueden ser correctos.
MongoDB soporta combinaciones con colecciones sharded bajo condiciones dependientes de versión. El coste puede incluir comunicación entre shards y routers.
Evalúa:
shard key local y extranjera;
si la query es targeted;
colocación por tenant;
cardinalidad;
transacciones o joins cross-shard;
versión y FCV.
No asumas que un lookup localmente rápido tendrá el mismo coste distribuido.
La condición extranjera debe incluir tenant cuando la colección lo requiera. Unirse solo por un identificador enviado o almacenado incorrectamente puede mezclar datos entre negocios.
No permitas al cliente elegir from, pipeline o paths arbitrarios.
$lookup es composición de lectura, no integridad. Funciona bien con relaciones selectivas, índices adecuados y cardinalidad controlada. Antes de usarlo en un hot path, compara con embedding, batch queries y datos derivados, especialmente en clusters sharded.
Comprueba lo aprendido
¿Por qué el resultado de lookup es un array?
¿Qué índice necesita el lado extranjero?
¿Cuándo una pipeline correlacionada es útil?
¿Cómo puede unwind duplicar métricas?
¿Qué diferencia existe entre lookup e integridad referencial?