【问题标题】:MongoDB lookup by _id with let does not work_id 和 let 的 MongoDB 查找不起作用
【发布时间】:2021-03-15 18:37:21
【问题描述】:

我正在使用聚合查询从多个集合中检索数据,但是有一个我似乎不理解的奇怪行为。

我需要查找抛出两个集合,因此在管道内查找。并且还使用我正在聚合(campaignadgroups)的集合中的_id 来匹配第二个嵌套集合(broadcastplans)

这是我的查询:

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"
     }
 },
    
    ])

问题是通过匹配$$campaignadgroupid 报告文档是空的。

但是,如果我将变量替换为像 ObjectId("5fc8f7275148d7d0a19dcbcc") 这样的硬编码 id,我会得到我假装的文档。

作为参考,我正在 Robot3T 上调试此问题,以便稍后转换为 mongoose。

我已经尝试使用$toObjectId,但是_ids 已经不是字符串而是ObjectIds

非常感谢

【问题讨论】:

    标签: node.js mongodb mongoose aggregate


    【解决方案1】:

    好的,这就是我喜欢和讨厌编码的原因。在这里询问后 3 小时调试后,我立即发现了问题......我只需要从

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 2018-11-10
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多