In Mongoose, come posso ordinare per data? (node.js)


161

diciamo che eseguo questa query in Mongoose:

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

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

Questo non funziona!

Risposte:


429

L'ordinamento in Mongoose si è evoluto rispetto alle versioni in modo tale che alcune di queste risposte non siano più valide. A partire dalla versione 4.1.x di Mongoose, un ordinamento decrescente sul datecampo può essere eseguito in uno dei seguenti modi:

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

Per un ordinamento crescente, omettere il -prefisso sui valori di versione stringa o uso di 1, asco ascending.


1
+1 per mostrare tonnellate di modi diversi che può essere fatto. Tuttavia, non riesco a trovare nei documenti che Query # find prenderà così tanti argomenti. La firma è Query#find([criteria], [callback]). Ho pensato che forse ci fosse una stretta di mano segreta che dice che "criteri" può contenere fino a tre argomenti, ma elenca il tipo come "Oggetto".
Nateowami,

@Nateowami Stai guardando il findmetodo sbagliato nei documenti. Vedere Model.find.
JohnnyHK,

1
Hai ragione. Ho visto che stavano usando la Module#propertynotazione e ho cercato #find. Sembra che non ci sia un modo semplice per navigare o cercare i documenti. La ricerca di find produce 187 risultati.
Nateowami,

2
Puoi anche ordinare per _idcampo. Ad esempio, per ottenere il record più recente, puoi fare:await db.collection.findOne().sort({ _id: -1 });
Mike K

53

La risposta corretta è:

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

});

13
la sintassi
dell'ordinamento

3
Questo non ha funzionato per me. Viene visualizzato l'errore "User.find (...). Sort (...). ExecFind non è una funzione"
Sandip Subedi

12

Oggi ho affrontato questo problema usando Mongoose 3.5 (.2) e nessuna delle risposte mi ha aiutato a risolverlo. Il seguente frammento di codice fa il trucco

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

È possibile inviare qualsiasi parametro standard necessario find()(ad es. Dove clausole e campi di restituzione) ma nessun callback. Senza una richiamata restituisce un oggetto Query su cui si esegue la catena sort(). È necessario chiamare find()nuovamente (con o senza più parametri - non dovrebbe averne bisogno per motivi di efficienza) che consentirà di ottenere il set di risultati nel callback.


4

Lo faccio:

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

Questo mostrerà prima le cose più recenti.


1
$orderbyè obsoleto in MongoDB 3.2, quindi non dovrebbe più essere utilizzato.
JohnnyHK,

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

Dovrebbe funzionare anche

MODIFICARE:

Puoi anche provare a usarlo se ricevi l'errore sort() only takes 1 Argument:

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

1
questo mi dà l'errore:Error: sort() only takes 1 Argument
mrid

@LukeXF, vedere la risposta aggiornata. spero che ti aiuti :)
mrid

@mrid dovrebbe essere come: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi il

2

Soluzione breve:

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

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

1

Quel primo metodo non funziona. Si blocca ... Penso che sia a causa di un aggiornamento in mangusta .... E il secondo metodo sono solo i documenti di Mongo, che conosco.
TIMEX,

La funzione find () è la funzione di MongoDB, non Mongoose. Leggere la pagina API Mongoose per maggiori dettagli. È possibile utilizzare la sintassi definita nei documenti MongoDB con Mongoose. Ecco perché Mongoose non ha le proprie query di ordinamento o di intersezione.
Neebz,

0

Puoi anche ordinare per _idcampo. Ad esempio, per ottenere il record più recente, puoi fare,

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

È anche molto più veloce, perché sono più che disposto a scommettere che il tuo datecampo non è indicizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.