Как получить документы из коллекции Mongodb по частям для загрузки с помощью прокрутки до React - PullRequest
1 голос
/ 22 января 2020

У меня есть модель Mon goose:

const { Schema, model } = require('mongoose');
const schema = new Schema({
 user: { type: Schema.Types.ObjectId, ref: 'User' },
 message: { type: String }
});
module.exports = model('Comments', schema);

Как загрузить данные по частям из этой коллекции? Я хочу загрузить 5 документов с каждым запросом, затем с новым запросом следующие 5 и скоро. Что я делаю не так?

router.get('/', async (req, res) => {
  try {

    const userComments = await Comment.find({},{message:{ $slice: [5, 5] }})
      .populate('user', ['avatar', 'firstName'])
      .sort({ $natural: -1 });

Я пытался, но данные приходят полностью, а не на 5;

это не работает .find({},{$slice: [5, 5] });, если я пытался:

     const userComments = await Comment.find()
      .populate('user', ['avatar', 'firstName'])
      .sort({ $natural: -1 }).skip(5).limit(5);

но те же 5 документов возвращаются с каждым запросом; Часть моей коллекции 'комментарии':

    {"_id":{"$oid":"5e26c87b590ed71b9897dbca"},
    "user":{"$oid":"5e2571ba388ea01bcc26bc96"},
    "message":"wwwwwww","__v":{"$numberInt":"0"}}

    {"_id":{"$oid":"5e26c87b590ed71b9897dbca"},
    "user":{"$oid":"5e2571ba388ea01bcc26bc96"},
    "message":"qqqqq","__v":{"$numberInt":"0"}}

заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 января 2020

С помощью .limit вы можете ограничить количество документов, а с помощью .skip вы можете пропустить первые извлеченные записи для следующего набора документов. например,

Для загрузки первого набора документов:

find().limit(5);

Для загрузки следующего набора документов (2-я страница):

find().skip(5).limit(5);

В этом втором получении он будет пропущен первый выбранный документ и следующий набор из 5 документов, так как мы указали предельное количество как 5.

0 голосов
/ 22 января 2020

$ slice просто нарезает массив, а не всю коллекцию документов.

Вам нужно использовать $skip и $limit, как у вас, но реализовать разбиение на страницы с query параметр.

Это означает, что при отправке запроса на сервер он должен выглядеть следующим образом: https://myserver?page=1 и при следующей загрузке https://myserver?page=2

На стороне сервера просто перейдите на код, соответствующий запросу:

const PAGE_SIZE = 5;
let skip = req.query.page ? parseInt(req.query.page) : 0;

const userComments = await Comment.find()
    .populate('user', ['avatar', 'firstName'])
    .sort({ $natural: -1 }).skip(skip * PAGE_SIZE).limit(PAGE_SIZE);

Я также рекомендую перенести проверки параметров запроса и санитарию на промежуточное ПО, так как это рекомендуется, я лично использую express-validator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...