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!

TIMEX
quelle

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.

JohnnyHK
quelle
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
53

Die richtige Antwort ist:

Blah.find({}).sort({date: -1}).execFind(function(err,docs){

});
TIMEX
quelle
13
die aktualisierte Art Syntax für das obige Beispiel ist: sort ( '- Datum') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel
3
Dieser hat bei mir nicht funktioniert. Ich erhalte die Fehlermeldung "User.find (...). Sort (...). ExecFind ist keine Funktion"
Sandip Subedi
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.

Jimmy Hillis
quelle
4

Ich mache das:

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

Dies zeigt zuerst die neuesten Dinge.

Noah
quelle
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
});
lynx_vbg
quelle
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) { ... });
davidsonsns
quelle
1

Sehen Sie, ob dies hilft> Wie sortiere ich Mungo?

Lesen Sie auch diese> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

neebz
quelle
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.

Mike K.
quelle