дать этому конвейеру попытку:
db.collection.aggregate([
{
$sort: { _id: -1 }
},
{
$group: {
_id: "$user_id",
videos: { $push: "$$ROOT" }
}
},
{
$project: {
_id: 0,
user_id: "$_id",
videos: { $slice: ["$videos", 5] }
}
}
])
https://mongoplayground.net/p/6NOOJDnfIhk
объяснение:
-
На первом этапе вы сортируете всю коллекцию в порядке убывания в поле _id. Первоначально сортировка необходима, потому что в mon go нет оператора, который мог бы сортировать сгруппированные элементы afaik.
, затем вы группируете по полю user_id. мы $ pu sh все документы каждой группы в новое поле под названием видео. Переменная $$ ROOT предоставляет вам доступ ко всем документам каждой группы.
на последнем этапе проекта $ используется $ slice, чтобы выбрать только первые 5 элементов в массиве видео из предыдущего stage и устанавливает его в одноименное поле.