Wie sortiere ich eine Sammlung nach Datum in MongoDB?

125

Ich benutze MongoDB mit Node.JS. Ich habe eine Sammlung, die ein Datum und andere Zeilen enthält. Das Datum ist ein JavaScript- DateObjekt.

Wie kann ich diese Sammlung nach Datum sortieren?

fließen
quelle
1
simple, collection.find (). sort ({datefield: 1}, function (err, cursor) {...}); oder Sie können auch collection.find () verwenden. sort ({datefield: -1}, function (err, cursor) {...});
Atul Jain
Beachten Sie, dass Sie möglicherweise keine dateSpalte benötigen : stackoverflow.com/questions/5125521/…
phil294

Antworten:

185

Nur eine kleine Änderung an @JohnnyHK Antwort

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

In vielen Anwendungsfällen möchten wir, dass die neuesten Datensätze zurückgegeben werden (z. B. für die neuesten Updates / Einfügungen).

Sushant Gupta
quelle
1
Was beabsichtigen Sie in die Funktion zu setzen? Nur zu versuchen, DateObjekte ohne Funktion zu sortieren, funktioniert in 2.6.3 für mich nicht.
Sam Brightman
@ SamBrightman Diese Funktion ist nur ein Rückruf. Was auch immer Sie mit dem Abfrageergebnis tun möchten, Sie fügen diese Logik in Ihren Rückruf ein. Sie können mehr darüber lesen, was Rückrufe sind und wie sie funktionieren, um ereignisbasierte Programmierung zu lernen.
Sushant Gupta
Klar, ich weiß, was ein Rückruf ist. Ich habe nur die Sortieranforderung in der Frage gesehen und alle Antworten geben Rückrufe. Gleichzeitig funktionierte das Sortieren bei mir nicht, daher dachte ich, dass Sie möglicherweise zusätzliche Arbeit in der Funktion leisten müssen.
Sam Brightman
1
@ SamBrightman Oh ok. Der Einfachheit halber können Sie explizit und kettenartig seincollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta
5
es heißt, sort () braucht nur 1 Argument
Jitendra Pancholi
39

Das Sortieren nach Datum erfordert nichts Besonderes. Sortieren Sie einfach nach dem gewünschten Datumsfeld der Sammlung.

Aktualisiert für den nativen Treiber 1.4.28 node.js, können Sie aufsteigend auf datefieldeine der folgenden Arten sortieren :

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'oder 'ascending'kann auch anstelle der verwendet werden 1.

Absteigend zu sortieren, verwenden 'desc', 'descending'oder -1anstelle des 1.

JohnnyHK
quelle
Ich wende die obige Lösung auf das Feld "Benutzername" an. Es funktioniert einwandfrei, aber es wird zwischen Groß- und Kleinschreibung unterschieden. Wie wird es ignoriert?
Rahul Matte
Richtige Antwort mit Multi Way (y)
Abdulbarik
28
db.getCollection('').find({}).sort({_id:-1}) 

Dadurch wird Ihre Sammlung in absteigender Reihenfolge nach dem Datum des Einfügens sortiert

Rich Rajah
quelle
16

Sushant Guptas Antworten sind etwas veraltet und funktionieren nicht mehr.

Das folgende Snippet sollte jetzt so sein:

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

krikara
quelle
@ JohnnyHK Süß. Ich erinnere mich nicht an das genaue Szenario, aber letzten Sommer habe ich versucht, die Sorte mit Sushants Snippet zum Laufen zu bringen, und es hat bei mir einfach nicht funktioniert. Vielleicht liegt es daran, dass das toArrayTeil fehlte .
Krikara
Dies ist eigentlich eine falsche Antwort, es gibt ein falsches Ergebnis in node.js
David A
12

Das hat bei mir funktioniert:

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

Verwenden von Node.js, Express.js und Monk

GoldfischGrenade
quelle
5

Mit Mungo ist es so einfach wie:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})
emil.c
quelle
4

Eine zusätzliche eckige [] Klammer ist erforderlich, damit die Sortierparameter funktionieren.

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

Wenn Ihr Datumsformat wie folgt lautet: 14/02/1989 ----> Möglicherweise treten Probleme auf

Sie müssen ISOdate wie folgt verwenden:

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

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

Verwenden Sie jetzt einfach die Abfrage wie folgt:

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

das ist es :)

Amine_Dev
quelle
2

Mit Mungo konnte ich 'toArray' nicht verwenden und bekam den Fehler: TypeError: Collection.find(...).sort(...).toArray is not a function. Die toArray-Funktion ist in der Cursor-Klasse vom Native MongoDB NodeJS-Treiber ( Referenz ) vorhanden.

Außerdem akzeptiert sort nur einen Parameter, sodass Sie Ihre Funktion nicht darin übergeben können.

Das hat bei mir funktioniert (wie von Emil beantwortet ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Pransh Tiwari
quelle