【发布时间】: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