简体   繁体   中英

MongoDB lookup by _id with let does not work

I'm using a aggregate query to retrieve data from multiple collections, however there is a strange behavior that I dont seem to understand.

I need to lookup throw two collections, thus the lookup inside the pipeline. And also use the _id from the collection I'm making the aggregation(campaignadgroups) to match on the second nested collection (broadcastplans)

This is my query:

db.getCollection('campaignadgroups').aggregate([
    {
     $match: { "campaign_id": ObjectId("5fc8f7125148d7d0a19dcbcb")}   // hardcoded just for tests
     },
     {
         $lookup: {
         from: "broadcastreports",
         let: {campaignadgroupid: "$_id"},
         pipeline: [
         {
             $match: {"reported_at": { $gte:ISODate("2020-12-01T15:56:58.743Z"), $lte: ISODate("2020-12-03T15:56:58.743Z")} }
         },
         {
         $lookup: {
             from: "broadcastplans",
             localField: "broadcast_plan_id",
             foreignField: "_id",
             as: "broadcastplan"
             }
         },
         {$unwind: "$broadcastplan"},
        {
           $match: { "broadcastplan.campaign_ad_group_id": {$eq: "$$campaignadgroupid"} // The problem happens here
               } 
           }
        
         ],
         as: "report"
     }
 },
    
    ])

The issue is that by matching with $$campaignadgroupid the report documents is empty.

However, if I replace the variable with the hardcoded id like ObjectId("5fc8f7275148d7d0a19dcbcc") I get the documents that I pretend.

For reference I'm debugging this issue on Robot3T so I can then translate to mongoose later.

I tried already to use $toObjectId however the _ids are not strings but ObjectIds already.

Thank you very much

Ok this is why I love and hate to code. After 3h debugging after asking here I immediately discovered the issue... I just needed to change from

$match: { "broadcastplan.campaign_ad_group_id": {$eq: "$$campaignadgroupid"}

to

$match: { $expr: { $eq: ["$broadcastplan.campaign_ad_group_id", "$$campaignadgroupid"]}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM