2012-03-21 2 views
2

Я ищу для решения следующих:Как вернуть позицию документа, относительно сбора в MongoDB (масштабируемый)

У меня есть сортируемая, постраничного стол, представляющий коллекцию в 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); 

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

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

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, но он очень похож на этот!

+0

Документ MongoDB не имеет позиции относительно коллекции. В этом отношении Mongo очень похож на традиционный SQL-сервер. Например, в зависимости от того, была ли вы сортировка по имени или возрасту, данный документ может одновременно быть первым и последним документом в коллекции. Что вы пытаетесь достичь? –

+0

Я пытаюсь определить положение документа в соответствии с данным запросом в возвращаемом массиве коллекции, не используя forEach. Вот и все. Но, похоже, нет другого пути, кроме этого! – drinchev

+0

Но почему вы пытаетесь определить положение документа внутри коллекции в соответствии с запросом? –

ответ

3

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

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

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

Это будет извлекать poistion выбранного элемента с помощью выбранного рода.

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

0

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

Смежные вопросы