Wie sortiere ich in Mongoose nach Datum? (node.js)


159

Angenommen, ich führe diese Abfrage in Mongoose aus:

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

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

Das funktioniert nicht!

Antworten:


427

Die Sortierung in Mongoose hat sich im Laufe der Veröffentlichungen dahingehend weiterentwickelt, dass einige dieser Antworten nicht mehr gültig sind. Ab der Version 4.1.x von Mongoose kann eine absteigende Sortierung auf dem dateFeld auf eine der folgenden Arten durchgeführt werden:

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

Für eine aufsteigende Sortierung, lassen Sie den -Präfix auf den String - Version oder Gebrauchswerte von 1, ascoder ascending.


1
+1 für die Anzeige von Tonnen verschiedener Möglichkeiten. Ich kann jedoch in den Dokumenten nicht finden, dass Query # find so viele Argumente akzeptiert. Die Unterschrift ist Query#find([criteria], [callback]). Ich dachte, vielleicht gab es einen geheimen Handschlag, der besagt, dass "Kriterien" bis zu drei Argumente umfassen können, aber der Typ wird als "Objekt" aufgeführt.
Nateowami

@Nateowami Du siehst die falsche findMethode in den Dokumenten. Siehe Model.find.
JohnnyHK

1
Du hast recht. Ich sah, dass sie die Module#propertyNotation verwendeten und suchte nach #find. Es scheint, dass es keine einfache Möglichkeit gibt, in den Dokumenten zu navigieren oder zu suchen. Die Suche nach Fund ergibt 187 Ergebnisse.
Nateowami

1
Sie können auch nach _idFeld sortieren . Um beispielsweise den neuesten Datensatz zu erhalten, haben Sie folgende Möglichkeiten:await db.collection.findOne().sort({ _id: -1 });
Mike K


12

Ich habe mich heute mit Mongoose 3.5 (.2) mit diesem Problem befasst, und keine der Antworten hat mir wirklich geholfen, dieses Problem zu lösen. Das folgende Code-Snippet macht den Trick

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

Sie können alle Standardparameter senden, die Sie benötigen find()(z. B. where-Klauseln und Rückgabefelder), aber keinen Rückruf. Ohne Rückruf wird ein Abfrageobjekt zurückgegeben, das Sie verketten sort(). Sie müssen find()erneut aufrufen (mit oder ohne weitere Parameter - sollte aus Effizienzgründen keine benötigen), damit Sie die Ergebnismenge in Ihrem Rückruf erhalten.


4

Ich mache das:

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

Dies zeigt zuerst die neuesten Dinge.


1
$orderbyist in MongoDB 3.2 veraltet und sollte daher nicht mehr verwendet werden.
JohnnyHK

4
Post.find().sort({date:-1}, function(err, posts){
});

Sollte auch funktionieren

BEARBEITEN:

Sie können dies auch versuchen, wenn der Fehler angezeigt wird sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});

1
Dies gibt mir den Fehler:Error: sort() only takes 1 Argument
Mrid

@LukeXF siehe die aktualisierte Antwort. Ich hoffe, es hilft Ihnen :)
Mrid

@ Mrid sollte es sein wie: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi

2

Kurze Lösung:

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

Room.find(query, projection, options).exec(function(err, docs) { ... });

1

Diese erste Methode funktioniert nicht. Es hängt nur ... Ich denke, es liegt an einem Update in Mungo ... Und die zweite Methode sind nur die Mongo-Dokumente, die ich kenne.
TIMEX

Die find () -Funktion ist die Funktion von MongoDB, nicht Mongoose. Weitere Informationen finden Sie auf der Mongoose-API-Seite. Sie können die in MongoDB-Dokumenten mit Mongoose definierte Syntax verwenden. Aus diesem Grund hat Mongoose keine eigenen Sortier- oder Schnittabfragen.
Neebz

0

Sie können auch nach _idFeld sortieren . Um beispielsweise den neuesten Datensatz zu erhalten, können Sie Folgendes tun:

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

Es geht auch viel schneller, weil ich mehr als bereit bin zu wetten, dass Ihr dateFeld nicht indiziert ist.

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.