在聚合查找匹配表达式中引用根 _id 不起作用

Referencing root _id in aggregate lookup match expression not working

这是我第一次使用 aggregate pipeline。我无法获得在管道内工作的“$match”表达式。如果我删除“_id”匹配项,我会得到集合中超过开始日期的每个文档,但是一旦我添加 $eq 表达式,它 returns 为空。

我阅读了很多其他示例并尝试了许多不同的方法,这似乎是正确的。但是结果是空的。

有什么建议吗?

let now = new Date()

let doc = await Team.aggregate([
    { $match: { created_by: mongoose.Types.ObjectId(req.params.user_oid)} },
    { $sort: { create_date: 1 } },
    { $lookup: { 
        from: 'events', 
        let: { "team_oid": "$team_oid" },
        pipeline: [
          { $addFields: { "team_oid" : { "$toObjectId": "$team_oid" }}},
          { $match: {
              $expr: { 
                $and: [
                  { $gt: [ "$start", now ] },
                  { $eq: [ "$_id", "$$team_oid" ] }
                ]
              },
            } 
          }, 
          {
            $sort: { start: 1 }
          },
          {
            $limit: 1
          }
        ],
        as: 'events',
    }},
    {
        $group: {
            _id: "$_id",
            team_name: { $first: "$team_name" },
            status: { $first: "$status" },
            invited: { $first: "$invited" },
            uninvited: { $first: "$uninvited" },
            events: { $first: "$events.action" }, 
            dates: { $first: "$events.start" } ,
            team_oid: { $first: "$events.team_oid" }
        }
    }])

示例文档(应要求添加)

事件:

_id:ObjectId("60350837c57b3a15a414d265")
invitees:null
accepted:null
sequence:7
team_oid:ObjectId("60350837c57b3a15a414d263")
type:"Calendar Invite"
action:"Huddle"
status:"Questions Issued"
title:"Huddle"
body:"This is a Huddle; you should receive new questions 5 days befor..."
creator_oid:ObjectId("5ff9e50a206b1924dccd691e")
start:2021-02-26T07:00:59.999+00:00
end:2021-02-26T07:30:59.999+00:00
__v:0

团队:

_id:ObjectId("60350837c57b3a15a414d263")
weekly_schedule:1
status:"Live"
huddle_number:2
reminders:2
active:true
created_by:ObjectId("5ff9e50a206b1924dccd691e")
team_name:"tESTI"
create_date:2021-02-23T13:50:47.172+00:00
__v:0

这只是一个猜测,因为您的问题中没有架构。但看起来你有一些 _ids 混淆了。您当前正在尝试 $match _id 等于 team_oid 的事件。而不是事件的 team_oid 字段等于当前 'team' _id.

我非常有信心这会产生正确的输出。如果您 post 任何架构或示例文档,我将对其进行编辑。

https://mongoplayground.net/p/5i1w2Ii7KCR

let now = new Date()

let doc = await Team.aggregate([
  { $match: { created_by: mongoose.Types.ObjectId(req.params.user_oid)} },
  { $sort: { create_date: 1 } },
  { $lookup: { 
      from: 'events', 
      // Set tea_oid as the current team _id 
      let: { "team_oid": "$_id" },
      pipeline: [
        { $match: {
            $expr: { 
              $and: [
                { $gt: [ "$start", now ] },
                // Match events whose 'team_oid' field matches the 'team' _id set above
                { $eq: [ "$team_oid", "$$team_oid" ] }
              ]
            },
          } 
        }, 
        {
          $sort: { start: 1 }
        },
        {
          $limit: 1
        }
      ],
      as: 'events',
  }},
  {
      $group: {
          _id: "$_id",
          team_name: { $first: "$team_name" },
          status: { $first: "$status" },
          invited: { $first: "$invited" },
          uninvited: { $first: "$uninvited" },
          events: { $first: "$events.action" }, 
          dates: { $first: "$events.start" } ,
          team_oid: { $first: "$events.team_oid" }
      }
  }])