Buenos días. Estoy tratando de consultar mongoDB uniendo dos colecciones. Pero no puedo hacer eso cuando el identificador primario está dentro de una matriz en la colección secundaria. Mira mi código y mi colección

Recolección de tuberías

{ _id: 1, deal_id: 25698}
{ _id: 2, deal_id: 45879}
{ _id: 3, deal_id: 54142}

Colección de clientes potenciales

{ _id: 1, name:"Teste A", deals_id:[25698,45879]}
{ _id: 2, name:"Teste B", deals_id:[54142]}

Resultado deseado al buscar deal_id de la colección Pipe:

Resultados

{ _id: 1, deal_id: 25698, name:"Teste A"}
{ _id: 2, deal_id: 45879, name:"Teste A"}
{ _id: 3, deal_id: 54142, name:"Teste B"}

Mi código:

db.pipedrive.aggregate([
    {
        $lookup: {
            from: "leads",
            'let': {
                deal_id: '$deal_id'
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $and: [
                                {$eq: ["$$deal_id", "$deals_id"]}
                            ]
                        }
                    }
                }
            ],
            as: "Results"
        }
    }
]);

Como estoy haciendo actualmente, la línea de análisis siempre me devuelve vacía.

¿Me puedes ayudar?

0
Saulo 26 jun. 2020 a las 16:11

2 respuestas

La mejor respuesta

Con su enfoque original, el intercambio de $eq con $in debería funcionar, y dado que solo tiene una condición, $and no es necesario. Tenga en cuenta que $deals_id debe existir en un documento extraño y debe ser una matriz, ya que $in requiere que el segundo parámetro sea una matriz. Entonces, en caso de que no exista, tendremos que envolverlo con $ifNull

db.pipedrive.aggregate([{
  $lookup: {
    from: "leads",
    let: {
      deal_id: '$deal_id'
    },
    pipeline: [
      {
        $match: {
          $expr:  { $eq: ["$$deal_id", { $ifNull: ["$deals_id", []] ] }
        }
      }
    ],
    as: "Results"
  }
}
// optional other stages to output as desired shape
]);

Una mejor alternativa sería usar $lookup regular, ya que mongodb puede compararlo con los elementos de la matriz de campos foráneos. Al igual que con la consulta de búsqueda. Esto también tendrá en cuenta los campos faltantes o los campos que no son de matriz.

db.pipedrive.aggregate([{
  $lookup: {
    from: "leads",
    localField: "deal_id",
    foreignField: "deals_id",
    as: "Results"
  }
}
// optional other stages to output as desired shape
  {
    $unwind: "$Results"
  },
  {
    $project: {
      deal_id: true,
      name: "$Results.name"
    }
  }
]);

Parque infantil Mongo

0
thammada.ts 26 jun. 2020 a las 13:50

Puede usar esta consulta para obtener los resultados deseados. $lookup también se encargará de la matriz.

db.pipe.aggregate([
  {
    $lookup: {
      from: "leads",
      localField: "deal_id",
      foreignField: "deals_id",
      as: "results"
    }
  },
  {
    $unwind: "$results"
  },
  {
    $project: {
      _id: 1,
      deal_id: 1,
      name: "$results.name"
    }
  }
])

Aquí está el enlace para verificar los resultados, https://mongoplayground.net/p/mhF6zHD9d26

0
Abdul Moiz 26 jun. 2020 a las 13:50