MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Correspondência de pipeline $lookup do MongoDB por _id não está funcionando


Eu também estava com problemas ao usar $ lookup com mangusto para tentar corresponder _id como minha coleção armazena a referência como uma String e não um ObjectId

Modelo A:{_id:ObjectId("xxx"), b_id:"eeeee"}

Modelo B:{_id:ObjectId("eeeee")}
MyCollectionA.aggregate([
   {
      $lookup: {
        from: "collectionb",
        let: {id: "$b_id"},
        pipeline: [{$match: {$expr: {$eq: ["$_id", "$$id"]}}}],
        as: b
      }
])

Neste exemplo, b nunca é preenchido, pois $$id não é considerado um ObjectId

Basta adicionar um projeto para transformar $$id em um objectId e seu trabalho
MyCollectionA.aggregate([
   {
      $lookup: {
        from: "collectionb",
        let: {id: "$b_id"},
        pipeline: [
           {$project: {_id: 1, bid: {"$toObjectId": "$$id"}}},
           {$match: {$expr: {$eq: ["$_id", "$bid"]}}}
        ],
        as: b
      }
])

Ou com ForeignField, localField:
MyCollectionA.aggregate([
   {
      $project:{
        _id: 1,
        b_id: {"$toObjectId": "$b_id"}
      }
   },
   {
      $lookup: {
        from: "collectionb",
        localField: "b_id",
        foreignField: "_id",
        as: b
      }
])