Как пропустить _id с мангуста? - PullRequest
0 голосов
/ 03 января 2019

Проблема с .skip(num) в mongoose заключается в том, что при добавлении данных в коллекцию, skip(num) может вернуть данные, которые существовали в предыдущем поиске. Решение было бы пропустить из _id, но я не смог найти такой вариант.

Так что вместо:

db.collection.find().sort({ _id: -1 }).skip(num).limit(50);

Мне нравится иметь возможность:

db.collection.find().sort({ _id: -1 }).skip(_id).limit(50);

В качестве альтернативы, если я могу получить индекс _id, то это тоже подойдет:

let res = await db.collection.findOne({_id});
let {index} = res;
db.collection.find().sort({ _id: -1 }).skip(index).limit(50);

Я использую метод Caffeinated.tech и попробовал:

const list = async function({
  end_cursor = ''
} = {}) {
  return await db.discovery.where('_id').gt(end_cursor).sort({ _id: -1 }).limit(50);
}

и я получил

CastError: Cast to ObjectId failed for value "" at path "_id" for model "discovery"

Правильный ответ

const list = async function(end_cursor) {
  if (!end_cursor) {
    return await db.discovery.where('_id').sort({ _id: -1 }).limit(50);
  }
  return await db.discovery.where('_id').lt(end_cursor).sort({ _id: -1 }).limit(50);
}

1 Ответ

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

Если вы хотите избежать дублирования при разбиении на страницы запроса, я бы посоветовал использовать gt и lt в where запросах, а не skip и limit.Это также дает вам преимущество, заключающееся в том, что вы получаете постоянную скорость, даже если на странице тысячи документов (чем больше значение skip, тем медленнее становится запрос).

ВотОбщая идея:

Я перечисляю контакты в адресной книге.Я загрузил и отобразил первые 100 контактов, сортируя по дате createdAt по возрастанию и ища имя aero.

  1. Из вашего пользовательского интерфейса / API / любого другого, передающего идентификаторпоследнего отображенного в данный момент контакта и текущих параметров сортировки / поиска.

  2. Загрузить указанный контакт из БД.Например, это были name: "aero 100" и `createAt:" 01/01/2019 "

  3. Теперь создайте свой запрос, используя этот контакт, так что вы продолжаете на следующем контакте после этого,Таким образом, вы захотите выполнить поиск по тому же имени, и поскольку мы сортируем по созданным при добавлении порядка сортировки и , ищите контакты, где createdAt больше, чем отметка времени createdAt последнего контакта.

 let lastContact = await Contact.findById(lastId)
 let nextPage = await Contact
   .where({ name: /aero/i })
   .sort({createdAt: 1})
   .gt(createdAt, lastContact.createdAt)
   .limit(100)
   .exec()

Я опубликовал плагин для mongoose, который должен упростить эту задачу, если вам не нужны сложные запросы / группы населения и т. Д .: мангуст-быстро-пагинация .

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