Я пытаюсь настроить запросы MongoDB для разбивки на страницы, но не могу использовать _id в качестве курсора.Кроме того, для производительности я не хочу использовать skip
.
Моя коллекция карт должна быть заказана с автоматической индексацией в Mongoose, например:
Cards.index({"userId": 1, "cardExpiration": 1, "validated": 1, "opTS": -1, "_id": -1})
В клиентской части:Я должен показать список элементов, разделенных на 2 раздела: я пытаюсь сначала показать раздел «активный», а после того, как все элементы из раздела «активный» были разбиты на страницы, затем я покажу элементы из «старого»'section.
Карты активны , когда они еще не истекли и не были «проверены».Если они были проверены или устарели, они старые .
Запрос, который я пытался создать, был таким:
const setQuery = (cursor) => {
let [section, id] = cursor.split('_')
let query = {}
query.userId = userId
query.cardExpiration = {$gt: now}
if (id) query._id = {$lt: id}
if (section == 'active') {
query.validated = false
}
if (section == 'old') {
query.$or = [
{'cardExpiration': {$lte: now}},
{'validated': true}
]
}
return query
}
Cards.find(query).limit(4)
Курсор пройденклиентом в качестве параметра для поиска, и должен быть sectionName_cursorNumber , например:
active_5c1ed0d1d50facca686a3700
или
old_5c1ed0d1d50facca686a37fd
с указанием текущего раздела и последнегокурсор возвращается для продолжения в следующей нумерации страниц.
Затем я выполняю запросы, начинающиеся с cursor = "active_"
, и добавляю часть курсора, пока количество возвращаемых элементов равно 4;и измените его на "old_"
, когда количество возвращенных предметов в первый раз будет меньше 4.Когда поиск типа old_5c1ed0d1d50facca686a37cc возвращает меньше 4, это конец списка.
Я пытался использовать _id - курсор, но он не работает - результаты не приходят в порядке, который я установил при индексации.И я не знаю, какую еще вещь использовать вместо курсора.
Я думаю, что, поскольку моя коллекция проиндексирована, должен быть способ получить курсор MongoDB в этой индексации ... ТогдаЯ мог бы вернуть курсор и использовать его в качестве отправной точки в следующем запросе.
Возможно ли это?Или есть другой и лучший способ?