MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $ lookup pipeline match by _id ne fonctionne pas

J'avais aussi des problèmes en utilisant $lookup avec mangouste pour essayer de faire correspondre _id car ma collection stocke la référence sous forme de chaîne et non d'ObjectId

Modèle A :{_id :ObjectId("xxx"), b_id :"eeeee"}

Modèle B :{_id :ObjectId("eeeee")}

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

Dans cet exemple, b n'est jamais rempli car $$id n'est pas considéré comme un ObjectId

Ajoutez simplement un projet pour transformer $$id en objectId et son fonctionnement

MyCollectionA.aggregate([
   {
      $lookup: {
        from: "collectionb",
        let: {id: "$b_id"},
        pipeline: [
           {$project: {_id: 1, bid: {"$toObjectId": "$$id"}}},
           {$match: {$expr: {$eq: ["$_id", "$bid"]}}}
        ],
        as: b
      }
])

Ou avec ForeignField, localField :

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