Включение дополнительных полей в агрегированный запрос Mongodb

#mongodb

#mongodb

Вопрос:

У меня есть такая структура данных. У каждого учащегося будет несколько записей в зависимости от того, когда они входят в классы. Запрос должен получить последнюю запись каждого учащегося на основе списка идентификаторов учащихся и названия отдела. В нем также должны отображаться идентификатор преподавателя и последняя временная карта

 [
  {
    "studentid": "stu-1234",
    "dept": "geog",
    "teacher_id": 1,
    "LastSwipeTimestamp": "2021-11-25T10:50:00.5230694Z"
  },
  {
    "studentid": "stu-1234",
    "dept": "geog",
    "teacher_id": 2,
    "LastSwipeTimestamp": "2021-11-25T11:50:00.5230694Z"
  },
  {
    "studentid": "stu-abc",
    "dept": "geog",
    "teacher_id": 11,
    "LastSwipeTimestamp": "2021-11-25T09:15:00.5230694Z"
  },
  {
    "studentid": "stu-abc",
    "dept": "geog",
    "teacher_id": 21,
    "LastSwipeTimestamp": "2021-11-25T11:30:00.5230694Z"
  }
]
 

Вот что у меня есть, но в нем не отображается идентификатор преподавателя или отметка времени последнего пролистывания. Что мне нужно изменить или добавить?

Комментарии:

1. В принципе, у вас это было на 99% правильно.

Ответ №1:

Может быть, вам нужно что-то вроде этого

 db.collection.aggregate([
  {
    $match: {
  "studentid": {
    "$in": [
      "stu-abc",
      "stu-1234"
    ]
     },
  "dept": "geog"
    }
  },
  {
    $sort: {
      "LastSwipeTimestamp": -1
    }
  },
  {
    $group: {
      "_id": {
        "studentid": "$studentid",
        "dept": "$dept"
      },
      "teacher_id": {
        $first: "$teacher_id"
      },
      "LastSwipeTimestamp": {
        $first: "$LastSwipeTimestamp"
      }
    }
  },
  {
    $project: {
      _id: 0,
      "studentid": "$_id.studentid",
      "dept": "$_id.dept",
      "teacher_id": "$teacher_id",
     "LastSwipeTimestamp": "$LastSwipeTimestamp"
    }
  }
 ])
 

объяснил:
Вам необходимо учитывать негруппированные поля на этапе $group, чтобы они также были доступны на следующем этапе $project…

Комментарии:

1. Как насчет редактирования ответа, поместив решение непосредственно в ответ и здесь? mongoplayground должен быть полезным дополнительным дополнением, но не заменой.