2016-09-21 12 views
6

Załóżmy, że mam model mongoose z nazwą "punkty". Zamawiam je z nazwą kolumny "punkty". I dowiedzenie się o moim dokumencie, przekazując w moim identyfikatorze użytkownika do kolumny nazwa_użytkownika id_użytkownika.MongoDB/Mongoose znaleźć liczbę wyników przed

W jaki sposób mogę uzyskać pewne informacje, takie jak "jest więcej osób niż ty?"

W tym przypadku, ile dokumentów ma więcej punktów niż Ty?

Ile wyszukiwań trzeba "zapętlić", dopóki nie pojawi się odpowiednik twojego dokumentu?

Odpowiedz

2

Ten problem został już rozwiązany w innym odpowiedź https://stackoverflow.com/a/22902445/6386175

Można użyć mapReduce dla małego zbioru danych lub lepiej utrzymać oddzielny uporządkowaną kolekcję.

Jeśli chcesz użyć mangusty, obiekt Model ma również metodę Model.mapReduce o tej samej składni.

+0

Czy możesz pokazać mi mapreduce lub zachować oddzielny zamówiony! – maria

+0

W podanym przykładzie mogę zobaczyć szczegółowe rozwiązanie twojego problemu. Zastąp "wynik" "punktami" ... i możesz uzyskać aktualną pozycję użytkownika w rankingu. – Dario

+0

Te same polecenia i rozwiązanie dla mangusty? – maria

5

Zapytanie o punkty użytkownika, a następnie zapytanie o liczbę użytkowników o punktach wyższych.

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

Dla skalowalnej wydajności, którą chcesz oddzielnie indeks userId i points. W swoim schemacie:

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

Powinno to być szybsze niż jakiekolwiek rozwiązanie zmniejszające mapę.

+1

Powinieneś pewnie upewnić się, że twoja kolekcja jest zaindeksowana we właściwości 'points', uruchamiając polecenie takie jak to: ' db.points.createIndex ({points: 1}) ', aby uniknąć powolnego uruchamiania' count' z większymi kolekcjami – Gaafar

+1

@Gaafar Yep, to samo z 'userId'. Dodam te informacje, dzięki. – JohnnyHK