@maksymNejmet

Как возможно реализовать пагинацию поддокументов в mongodb через mongoose в express?

Итак есть база данных mongodb с именем users

Структура данных такая:


id:"testId"(тут id пользователя)
firstName:"test",
lastName:"test",
email:"my@test",
phoneNumber:6556565656,
eventsCount:2,
events:[
0:{
title:"test",
description:"test",
startDate(тип дата):"09-03-11"
endDate(тип дата):"12-12-12"
},
1:{
title:"go",
description:"out",
startDate(тип дата):"11-12-09"
endDate(тип дата):"11-11-11"
}
]


Мне нужно реализовать пагинацию поддокумента event внутри документа user.
Пока-что у меня реализовано на express так:

app.get('/user/:id',async (req,res)=>{
    try {
        const page=parseInt(req.query.page) || 1
        const pageSize=parseInt(req.query.limit) || 1
  User.findById(req.params.id).then(users=>{
        res.send(users)
    })
    }
    catch (err){
        res.writeHead(500).json({
            status:'error',
            errorMessage:err
        })
    }
})


Такой endpoint возвращает целого пользователя:

id:"testId"(тут id пользователя)
firstName:"test",
lastName:"test",
email:"my@test",
phoneNumber:6556565656,
eventsCount:2,
events:[
0:{
title:"test",
description:"test",
startDate(тип дата):"09-03-11"
endDate(тип дата):"12-12-12"
},
1:{
title:"go",
description:"out",
startDate(тип дата):"11-12-09"
endDate(тип дата):"11-11-11"
}
]


Мне же нужно чтобы если запрос содержит page(req.query.page) и лимит-то делать пагинацию поддокумента events.
Например если page=1 и limit=1,то должно возвращать:


id:"testId"(тут id пользователя)
firstName:"test",
lastName:"test",
email:"my@test",
phoneNumber:6556565656,
eventsCount:2,
events:[
0:{
title:"test",
description:"test",
startDate(тип дата):"09-03-11"
endDate(тип дата):"12-12-12"
},
]


Если page=2 и limit=2 то возвращать:


id:"testId"(тут id пользователя)
firstName:"test",
lastName:"test",
email:"my@test",
phoneNumber:6556565656,
eventsCount:2,
events:[
0:{
title:"test",
description:"test",
startDate(тип дата):"09-03-11"
endDate(тип дата):"12-12-12"
},
1:{
title:"go",
description:"out",
startDate(тип дата):"11-12-09"
endDate(тип дата):"11-11-11"
}
]
  • Вопрос задан
  • 35 просмотров
Пригласить эксперта
Ответы на вопрос 1
@foterio
MongoDB - документо-ориентированая база данных. Как вы храните объект так она вам его и возвращает.
В вашем случае, я бы хранил только последние events на одну page в самом пользователе User, а когда нужно еще, то запрашивал уже остальные events из отдельной коллекции events с нужными skip и limit (заминусом тех events, которые вы уже показали из User.events).
При добавлении нового Event в events, вы затем возьмете последние, например, 20 events с помощью skip и limit, и затем обновите поле User.events новыми последними 20-ю событиями.
Это будет более-менее правильный подход в случае MongoDB.
Если же у Вас много остальных связей и таких же полей, то стоит задуматься, а правильно ли выбрана база данных, и может подойдет реляционные типа Postgres, MySQL.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы