Jak posortować zbiór według daty w MongoDB?

125

Używam MongoDB z Node.JS. Mam kolekcję zawierającą datę i inne wiersze. Data jest obiektem JavaScript Date.

Jak mogę posortować tę kolekcję według daty?

pływ
źródło
1
proste, kolekcja.find (). sort ({pole daty: 1}, funkcja (błąd, kursor) {...}); lub możesz też użyć collection.find (). sort ({datefield: -1}, function (err, kursor) {...});
Atul Jain
Zauważ, że możesz nie potrzebować datekolumny: stackoverflow.com/questions/5125521/ ...
phil294

Odpowiedzi:

186

Tylko niewielka modyfikacja odpowiedzi @JohnnyHK

collection.find().sort({datefield: -1}, function(err, cursor){...});

W wielu przypadkach chcemy, aby zwracane były najnowsze rekordy (np. Najnowsze aktualizacje / wstawki).

Sushant Gupta
źródło
1
Co zamierzasz umieścić w funkcji? Samo sortowanie Dateobiektów bez funkcji nie działa dla mnie w 2.6.3.
Sam Brightman,
@SamBrightman Ta funkcja to tylko wywołanie zwrotne. Cokolwiek chcesz zrobić z wynikiem zapytania, umieszczasz tę logikę w swoim wywołaniu zwrotnym. Możesz przeczytać więcej o tym, czym są wywołania zwrotne i jak działają, aby nauczyć się programowania opartego na zdarzeniach.
Sushant Gupta
Jasne, wiem, co to jest oddzwonienie. Widziałem tylko wymaganie sortowania w pytaniu i wszystkie odpowiedzi dają oddzwonienie. W tym samym czasie sortowanie u mnie nie działało, więc pomyślałem, że może trzeba będzie wykonać dodatkową pracę w funkcji.
Sam Brightman,
1
@SamBrightman Oh ok. Dla wygody możesz być wyraźny i łańcuchowy jakcollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta
5
mówi, że sort () przyjmuje tylko 1 argument
Jitendra Pancholi
39

Sortowanie według daty nie wymaga niczego specjalnego. Po prostu posortuj według żądanego pola daty kolekcji.

Zaktualizowano dla natywnego sterownika 1.4.28 node.js, możesz sortować rosnąco, datefieldkorzystając z jednego z następujących sposobów:

collection.find().sort({datefield: 1}).toArray(function(err, docs) {...});
collection.find().sort('datefield', 1).toArray(function(err, docs) {...});
collection.find().sort([['datefield', 1]]).toArray(function(err, docs) {...});
collection.find({}, {sort: {datefield: 1}}).toArray(function(err, docs) {...});
collection.find({}, {sort: [['datefield', 1]]}).toArray(function(err, docs) {...});

'asc'lub 'ascending'może być również używany zamiast 1.

Aby posortować malejąco, użyj 'desc' , 'descending'lub -1w miejsce 1.

JohnnyHK
źródło
Stosuję powyższe rozwiązanie w polu nazwy użytkownika, działa dobrze, ale rozróżnia się wielkość liter. Jak je zignorować?
Rahul Matte
Właściwa odpowiedź z wieloma drogami (y)
abdulbarik
29
db.getCollection('').find({}).sort({_id:-1}) 

Spowoduje to posortowanie kolekcji w porządku malejącym na podstawie daty wstawienia

Rich Rajah
źródło
16

Odpowiedzi Sushanta Gupty są nieco przestarzałe i już nie działają.

Poniższy fragment powinien teraz wyglądać tak:

collection.find({}, {"sort" : ['datefield', 'asc']} ).toArray(function(err,docs) {});

krikara
źródło
@JohnnyHK Sweet. Nie pamiętam dokładnego scenariusza, ale zeszłego lata próbowałem zmusić tego gatunku do pracy z fragmentem Sushanta i po prostu nie działał. Może dlatego, że brakowało jej toArrayczęści.
krikara
To właściwie zła odpowiedź, daje zły wynik w node.js
David A
12

To zadziałało dla mnie:

collection.find({}, {"sort" : [['datefield', 'asc']]}, function (err, docs) { ... });

Korzystanie z Node.js, Express.js i Monk

GoldfishGrenade
źródło
5

W przypadku mangusty jest to tak proste, jak:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})
emil.c
źródło
4

Aby parametr sortowania działał, wymagany jest dodatkowy nawias kwadratowy [] .

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});
DB Prasad
źródło
2

jeśli Twój format daty jest taki: 14/02/1989 ----> możesz napotkać pewne problemy

musisz użyć ISOdate w następujący sposób:

var start_date = new Date(2012, 07, x, x, x); 

-----> wynik ------> ISODate ("2012-07-14T08: 14: 00.201Z")

teraz po prostu użyj takiego zapytania:

 collection.find( { query : query ,$orderby :{start_date : -1}} ,function (err, cursor) {...}

Otóż ​​to :)

Amine_Dev
źródło
2

W przypadku mongoose nie mogłem użyć 'toArray' i otrzymywałem błąd: TypeError: Collection.find(...).sort(...).toArray is not a function. Funkcja toArray istnieje w klasie Cursor ze sterownika Native MongoDB NodeJS ( odniesienie ).

Również sort akceptuje tylko jeden parametr, więc nie możesz przekazać do niego swojej funkcji.

To zadziałało dla mnie (jak odpowiedział Emil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Pransh Tiwari
źródło