Unir colecciones con $lookup

Junta en una consulta documentos de dos colecciones.

Junta documentos de dos colecciones en una sola consulta con $lookup, como un join.

Requisitos

  • Una conexión con un usuario que tenga read sobre la base. Sobre las dos colecciones.

Unir por un campo

JavaScript
db.pedidos.aggregate([
  { $match: { estado: "pagado" } },
  { $lookup: { from: "clientes", localField: "cliente", foreignField: "_id", as: "datosCliente" } },
  { $unwind: "$datosCliente" },
]);

Unir con condiciones propias

JavaScript
db.clientes.aggregate([
  {
    $lookup: {
      from: "pedidos",
      let: { id: "$_id" },
      pipeline: [{ $match: { $expr: { $eq: ["$cliente", "$$id"] } } }, { $limit: 5 }],
      as: "ultimos",
    },
  },
]);

Comprobar

Cada documento del resultado lleva en datosCliente el documento del cliente de su pedido, sacado de clientes.

Problemas frecuentes

  • La unión tarda porque foreignField no tiene índice en la otra colección. Crea uno sobre ese campo.

Ver también