#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 должен быть полезным дополнительным дополнением, но не заменой.