【问题标题】:Referencing root _id in aggregate lookup match expression not working在聚合查找匹配表达式中引用 root _id 不起作用
【发布时间】:2021-05-26 21:58:24
【问题描述】:

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

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

有什么建议吗?

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

【问题讨论】:

  • 您能否发布“事件”和“团队”的示例文档或架构?
  • 我添加了文档。我看到你也发布了一个答案,但它消失了..?
  • 我重新安装了它。它在下面。我添加了一个游乐场只是为了确保它正常工作。我认为这应该是你的解决方案。
  • 哈哈,我已经测试过了,效果很好!!谢谢老哥
  • 太好了,非常欢迎您!

标签: mongodb mongoose aggregate pipeline


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2018-06-08
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多