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

Posted

技术标签:

【中文标题】在聚合查找匹配表达式中引用 root _id 不起作用【英文标题】:Referencing root _id in aggregate lookup match expression not working 【发布时间】: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

【问题讨论】:

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

【讨论】:

以上是关于在聚合查找匹配表达式中引用 root _id 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 查找与聚合匹配返回一个空数组

MongoDB 聚合 - 我如何“$lookup”嵌套文档“_id”?

VSCode 正则表达式查找和替换子匹配数学?

使用_id查找不适用于聚合[重复]

使用_id查找不适用于聚合[重复]

如何与数组中匹配的值聚合然后排序