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?


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).


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.


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


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


@ 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



5

Mit Mungo ist es so einfach wie:

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

4

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

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

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 :)


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
})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.