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!

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.


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


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.


4

Robię to:

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

To pokaże najnowsze rzeczy jako pierwsze.


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
});

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) { ... });

1

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.