Jak sortować według daty w Mongoose? (node.js)

161

powiedzmy, że uruchamiam to zapytanie w Mongoose:

Room.find({}, function(err,docs){

}).sort({date:-1}); 

To nie działa!

TIMEX
źródło

Odpowiedzi:

429

Sortowanie w Mongoose ewoluowało w kolejnych wersjach, tak że niektóre z tych odpowiedzi nie są już aktualne. Począwszy od wersji 4.1.x Mongoose, sortowanie malejące na datepolu można wykonać na jeden z następujących sposobów:

Room.find({}).sort('-date').exec(function(err, docs) { ... });
Room.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Room.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Room.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Room.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });

Dla rodzaju rosnącej, pomijać -przedrostek wersji ciąg lub użyj wartości 1, asclub ascending.

JohnnyHK
źródło
1
+1 za pokazanie wielu różnych sposobów, w jakie można to zrobić. Jednak nie mogę znaleźć w dokumentach, które Query # find przyjmie tyle argumentów. Podpis jest Query#find([criteria], [callback]). Pomyślałem, że może istniał jakiś tajny uścisk dłoni, który mówi, że „kryteria” mogą mieć maksymalnie trzy argumenty, ale wyświetla typ jako „Obiekt”.
Nateowami
@Nateowami Patrzysz na niewłaściwą findmetodę w dokumentacji. Zobacz Model.find.
JohnnyHK
1
Masz rację. Widziałem, że używali Module#propertynotacji i szukali #find. Wygląda na to, że nie ma łatwego sposobu nawigacji lub wyszukiwania dokumentów. Wyszukiwanie find daje 187 wyników.
Nateowami
2
Możesz także sortować według _idpola. Na przykład, aby uzyskać najnowszy rekord, możesz:await db.collection.findOne().sort({ _id: -1 });
Mike K
53

Poprawna odpowiedź to:

Blah.find({}).sort({date: -1}).execFind(function(err,docs){

});
TIMEX
źródło
13
zaktualizowana składnia sortowania dla powyższego przykładu to: sort ('- date') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel
3
Ten nie działał dla mnie. Pojawia się błąd „User.find (...). Sort (...). ExecFind is not a function”
Sandip Subedi
12

Miałem do czynienia z tym problemem dzisiaj, używając Mongoose 3.5 (.2) i żadna z odpowiedzi nie pomogła mi w rozwiązaniu tego problemu. Poniższy fragment kodu załatwia sprawę

Post.find().sort('-posted').find(function (err, posts) {
    // user posts array
});

Możesz wysłać dowolne standardowe parametry, których potrzebujesz find()(np. Klauzule gdzie i pola zwrotne), ale bez wywołania zwrotnego. Bez wywołania zwrotnego zwraca obiekt Query, na którym tworzysz łańcuch sort(). Musisz zadzwonić find()ponownie (z większą liczbą parametrów lub bez - ze względu na wydajność nie powinno to być potrzebne), co pozwoli Ci uzyskać wynik ustawiony w wywołaniu zwrotnym.

Jimmy Hillis
źródło
4

Robię to:

Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
    ...
})

To pokaże najnowsze rzeczy jako pierwsze.

Noe
źródło
1
$orderbyjest przestarzały w MongoDB 3.2, więc nie powinien być już używany.
JohnnyHK
4
Post.find().sort({date:-1}, function(err, posts){
});

Powinien również działać

EDYTOWAĆ:

Możesz również spróbować tego użyć, jeśli pojawi się błąd sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});
lynx_vbg
źródło
1
to daje mi błąd:Error: sort() only takes 1 Argument
mrid
@LukeXF, zobacz zaktualizowaną odpowiedź. mam nadzieję, że ci to pomoże :)
mrid
@mrid powinno wyglądać następująco: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi
2

Krótkie rozwiązanie:

const query = {}
const projection = {}
const options = { sort: { id: 1 }, limit: 2, skip: 10 }

Room.find(query, projection, options).exec(function(err, docs) { ... });
davidsonsns
źródło
1

Sprawdź, czy to pomoże> Jak sortować według mangusty?

Przeczytaj także> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

neebz
źródło
Ta pierwsza metoda nie działa. Po prostu się zawiesza ... Myślę, że to z powodu aktualizacji w mangusta ... A druga metoda to tylko dokumentacja mongo, o której wiem.
TIMEX
Funkcja find () jest funkcją MongoDB, a nie Mongoose. Aby uzyskać więcej informacji, przeczytaj stronę interfejsu API Mongoose. Możesz użyć składni zdefiniowanej w dokumentach MongoDB w Mongoose. Dlatego Mongoose nie ma własnego sortowania ani przecinających się zapytań.
neebz
0

Możesz także sortować według _idpola. Na przykład, aby uzyskać najnowszy rekord, możesz

const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });

Jest to również znacznie szybsze, ponieważ jestem bardziej niż skłonny założyć się, że twoje datepole nie jest indeksowane.

Mike K.
źródło