2016-09-21 4 views
6

Предположим, у меня есть модель мангуста с названием «очки». Я заказываю его с именем столбца «points». И узнав мой документ, передав в свой идентификатор пользователя имя столбца документа userid.MongoDB/Mongoose найти результаты поиска до вас

Как я могу узнать определенную информацию, такую ​​как «Есть ли люди xx лучше вас?»

В этом случае, сколько документов имеет более высокие баллы, чем вы?

Сколько поисков нужно «прокручивать» до тех пор, пока не будет найден ваш документ?

ответ

2

Эта проблема уже решена в другом ответе https://stackoverflow.com/a/22902445/6386175

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

Если вы хотите использовать мангуст, объект Model имеет метод Model.mapReduce тоже с тем же синтаксисом.

+0

Не могли бы вы показать мне mapreduce или сохранить отдельный заказ! – maria

+0

В приведенном примере вы можете увидеть подробное решение вашей проблемы. Замените «score» на «points» ... и вы можете получить текущую позицию пользователя в рейтинге. – Dario

+0

Те же команды ANd решение для мангуста? – maria

5

Запрос для очков пользователя, а затем запрос для подсчета пользователей с точками выше этого.

Points.findOne({userId: userId}, (err, doc) => { 
    Points.count({points: {$gt: doc.points}}, (err, count) => { 
     // do something with count... 
    }); 
}); 

Для масштабируемой производительности, вы хотите, чтобы отдельно индекс userId и points. В вашей схеме:

userId: {type: ObjectId, index: true}, 
points: {type: Number, index: true}, 
... 

Это должно быть быстрее, чем любое решение для уменьшения карты.

+1

Вероятно, вы должны убедиться, что ваша коллекция проиндексирована по свойству 'points', запустив такую ​​команду: ' db.points.createIndex ({points: 1}) ', чтобы избежать медленного выполнения' count' с большими коллекциями – Gaafar

+1

@Gaafar Yep, то же самое с 'userId'. Я добавлю эту информацию, спасибо. – JohnnyHK

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