Как вернуть позицию документа относительно коллекции в MongoDB (масштабируемая) - PullRequest
2 голосов
/ 21 марта 2012

Я ищу решение для следующего:

У меня есть сортируемая, разбитая на страницы таблица, представляющая коллекцию в mongodb

Чтобы взять начальные результаты и на каждой странице я использую следующее

var defaultRows = 10;
var defaultPage = 1;
var defaultSort = ['name'];
var page = defaultPage - 1;
var totalPages = Math.ceil(db.table.count() / defaultRows);

var results = db.table.find().skip(page * defaultRows).limit(defaultRows).sort(defaultSort);

Итак, я ищу решение для поиска документа и возвращаю точную страницу этого документа в соответствии с переменной sort.

Я придумал это, но это не очень хорошо подходит для больших коллекций.

var counter = 0;
var page = 1;
var queryName = 'smth';
db.table.find().sort(defaultSort).forEach( function ( doc ) {
    if ( doc.name === query.Name ) return false;
    counter++;
    if ( counter === 10 ) { counter = 0; page++ };
});

print page;  // Here page will give me the correct page

Но если у меня большая таблица, не было бы неправильно анализировать ее через forEach и загружать как коллекцию? Есть ли более простой способ сделать это, который является более масштабируемым.

* Конечно, это простой консольный скрипт javascript для mongo, я использую mongoosedb в качестве драйвера node.js, но он выглядит очень похоже на это!

Ответы [ 2 ]

3 голосов
/ 27 апреля 2015

Я знаю ваш вариант использования.Вы хотите отобразить разбитый на страницы список с предварительно выбранным элементом в списке.Ака, должна быть найдена правильная страница для загрузки из mongo.

Я использовал другой подход, используя что-то вроде этого:

db.user.find({name: {$lt: "foo"}}).sort({name: 1}).count()

Это восстановит положение выбранного элемента, используя вашвыбранная сортировка.

Теперь вы можете вычислять правильную страницу, как и раньше.

0 голосов
/ 21 марта 2012

Вы должны отслеживать любые изменения, используя уникальный идентификатор документа.Не следует использовать позицию в наборе результатов в качестве идентификатора документа.

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