Получить общее количество документов перед применением методов курсора при использовании async / await в MongoDB? - PullRequest
0 голосов
/ 15 января 2019

Как получить общее количество документов после использования .find () и до применения .sort (), .skip () и .limit ()?

Объект, переданный в .find (), в конечном итоге будет сгенерирован из параметра запроса, поэтому результаты подсчета будут отличаться каждый раз. Должен ли я использовать обещания вместо async / await?

app.get('/', async (req, res) => {
  let pageSize = parseInt(req.query.limit) || 250;
  let page = parseInt(req.query.page) || 1;

  try {
    let products = await db.collection('Furniture')
      .find({})
      .sort({})
      .skip((page - 1) * pageSize)
      .limit(pageSize)
      .toArray();
    res.json({products});
  } catch (e) { console.log('Error sending products', e); }
});

Необходимо добавить свойство count к json, отправленному в ответе, с общим количеством продуктов, которые соответствуют параметрам find ().

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Самое замечательное в find(), sort(), skip() и limit() состоит в том, что все они возвращают cursor. Это означает, что они могут быть объединены в цепочку, но это также означает, что на любом шаге вы можете назначить курсор переменной и запускать различные функции для нее, но при этом иметь курсор, когда вы закончите.

    let cursor = await db.collection('Furniture').find({})
    /* you want to wrap the following two in try catch as well, probably */
    let count = await cursor.count(); // do something with count then...

    let products = await cursor.sort({})
        .skip((page - 1) * pageSize)
        .limit(pageSize)
        .toArray();
0 голосов
/ 15 января 2019

Единственный способ, который я сделал, это сделать 2 запроса, один для счетчика, а другой для продуктов.

  try {
    let total = await db.collection('Furniture')
      .find({})
      .count();

    let products = await db.collection('Furniture')
      .find({})
      .sort({})
      .skip((page - 1) * pageSize)
      .limit(pageSize)
      .toArray();

    res.json({total, products});
  } catch (e) { console.log('Error sending products', e); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...