【问题标题】: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',
                },
              ],
            },
          },
        ])
      );

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-lookup


    【解决方案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}
      } 
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多