1

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

     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',
                },
              ],
            },
          },
        ])
      );
4

1 回答 1

1

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

但是,您当前的方法很好,只需要一个小的调整,我们需要过滤掉“旧”会议,为此让我们使用加入条件查找语法

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

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

蒙戈游乐场

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

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

{ 
  $match: { 
     verified: true,
     'meetup.0': {$exists: true}
  } 
}
于 2021-09-10T09:45:14.683 回答