如何获取满足匹配对象的关联文档

Posted

技术标签:

【中文标题】如何获取满足匹配对象的关联文档【英文标题】:How to get associated document who satisfy match object 【发布时间】:2021-11-06 19:09:21 【问题描述】:

在以下查询中,我想获取所有经过验证的学生及其相关会议。但试图获取所有即将到来的会议,这意味着会议至少有一个未来的日期时间。我的书面查询会获取所有经过验证的学生,但也会获取学生的所有会议,包括过去的会议。我希望仅在有任何即将举行的会议时才获取学生,并且仅在返回协会中获取即将举行的会议。我想根据最近的会议对客户对象数组进行排序任何帮助将不胜感激

     let aggregateDataQuery = [
        
          $lookup: 
            from: 'meetup',
            localField: '_id',
            foreignField: 'studentId',
            as: 'meetup',
          ,
        ,
        
          $project: 
            firstName: 1,
            lastName: 1,
            email: 1,
            meetup: 
              _id: 1,
              startTime: 1,
            ,
          ,
        ,
      ];

      const [result, err] = await of(
        Student.aggregate([
          ...aggregateDataQuery,
           $match:  
          verified: true,
              'meetup.startTime':  '$gte': 2021-09-10T08:41:15.746Z 
            
          ,
          
            $facet: 
              data: [
                 $sort: sortBy ,
                 $skip: skip ,
                 $limit: recordLimit ,
              ],
              count: [
                
                  $count: 'count',
                ,
              ],
            ,
          ,
        ])
      );

【问题讨论】:

【参考方案1】:

根据两个集合的规模,我建议从 meetings 集合开始查询,因为这样您可以更好地利用会议时间的索引(想象没有未来的会议,在当前的方法中您仍然匹配并查找整个学生集合)。

但是,您目前的方法很好,只需要一个小调整,我们需要过滤掉“旧”会议,为此让我们使用join condition lookup syntax。

现在您的新查找阶段将如下所示:


  "$lookup": 
    "from": "meetup",
    "let": 
      studentId: "$_id"
    ,
    "pipeline": [
      
        $match: 
          $expr: 
            $and: [
              
                $eq: [
                  "$$studentId",
                  "$studentId"
                ],
                
              ,
              
                $gt: [
                  "$startTime",
                  "$$NOW"
                ],
                
              
            ]
          
        
      ,
      
        $project: 
          _id: 1,
          startTime: 1,
          
        
      
    ],
    "as": "meetup"
  

Mongo Playground

您需要的行为将在您的管道的其余部分按预期工作。

您可以将 $match 查询更改为:

 
  $match:  
     verified: true,
     'meetup.0': $exists: true
   

【讨论】:

以上是关于如何获取满足匹配对象的关联文档的主要内容,如果未能解决你的问题,请参考以下文章

如何从 mongodb 通过 Geowithin 获取匹配的子文档?

如何获取与 DOM 元素关联的事件?

如何使用 Apache DbUtils 获取一对多关联和父子类型关联?

如何使用猫鼬获取所有文件及其计数

Apache Pig - 如何获取多个包之间的匹配元素数量?

在 Keras 中,如何获取与模型中包含的“模型”对象关联的图层名称?