使用let通过_id查找MongoDB不起作用



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

我需要查找抛出两个集合,从而在管道内查找。还使用我正在进行聚合的集合(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匹配,报告文档为空。

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

作为参考,我正在Robot3T上调试这个问题,这样我以后就可以翻译成猫鼬了。

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

非常感谢

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

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

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

最新更新