Dans Mongoose, comment trier par date? (node.js)

161

disons que je lance cette requête dans Mongoose:

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

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

Cela ne marche pas!

TIMEX
la source

Réponses:

429

Le tri dans Mongoose a évolué au fil des versions, de sorte que certaines de ces réponses ne sont plus valables. Depuis la version 4.1.x de Mongoose, un tri décroissant sur le datechamp peut être effectué de l'une des manières suivantes:

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

Pour un tri croissant, omettre le -préfixe sur les valeurs de version de chaîne ou de l' utilisation 1, ascou ascending.

JohnnyHK
la source
1
+1 pour montrer des tonnes de façons différentes de le faire. Cependant, je ne peux pas trouver dans la documentation que la requête # find prendra autant d'arguments. La signature est Query#find([criteria], [callback]). J'ai pensé qu'il y avait peut-être une poignée de main secrète qui dit que "critères" peut être jusqu'à trois arguments, mais il répertorie le type comme "objet".
Nateowami
@Nateowami Vous regardez la mauvaise findméthode dans la documentation. Voir Model.find.
JohnnyHK
1
Vous avez raison. J'ai vu qu'ils utilisaient la Module#propertynotation et j'ai cherché #find. Il semble qu'il n'y ait pas de moyen facile de naviguer ou de rechercher les documents. La recherche de find donne 187 résultats.
Nateowami
2
Vous pouvez également trier par _idchamp. Par exemple, pour obtenir l'enregistrement le plus récent, vous pouvez faire:await db.collection.findOne().sort({ _id: -1 });
Mike K
53

La bonne réponse est:

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

});
TIMEX
la source
13
la syntaxe de tri mis à jour pour l'exemple ci - dessus est: trier ( « - date ») mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel
3
Celui-ci n'a pas fonctionné pour moi. Je reçois une erreur "User.find (...). Sort (...). ExecFind n'est pas une fonction"
Sandip Subedi
12

J'ai traité ce problème aujourd'hui en utilisant Mongoose 3.5 (.2) et aucune des réponses ne m'a vraiment aidé à résoudre ce problème. L'extrait de code suivant fait l'affaire

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

Vous pouvez envoyer tous les paramètres standard dont vous avez besoin find()(par exemple, les clauses where et les champs de retour) mais pas de rappel. Sans rappel, il renvoie un objet Query sur lequel vous enchaînez sort(). Vous devez appeler à find()nouveau (avec ou sans plus de paramètres - ne devrait pas en avoir besoin pour des raisons d'efficacité), ce qui vous permettra d'obtenir le jeu de résultats dans votre rappel.

Jimmy Hillis
la source
4

Je fais ça:

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

Cela montrera les choses les plus récentes en premier.

Noé
la source
1
$orderbyest obsolète dans MongoDB 3.2, il ne devrait donc plus être utilisé.
JohnnyHK
4
Post.find().sort({date:-1}, function(err, posts){
});

Devrait fonctionner aussi bien

ÉDITER:

Vous pouvez également essayer d'utiliser ceci si vous obtenez l'erreur sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});
lynx_vbg
la source
1
cela me donne l'erreur:Error: sort() only takes 1 Argument
mrid
@LukeXF, veuillez consulter la réponse mise à jour. j'espère que cela vous aidera :)
mrid
@mrid ça devrait être comme: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi
2

Solution courte:

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

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

Voyez si cela aide> Comment trier la mangouste?

Lisez également ceci> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

neebz
la source
Cette 1ère méthode ne fonctionne pas. Il se bloque juste ... Je pense que c'est à cause d'une mise à jour de mangouste ... Et la deuxième méthode est juste les documents mongo, que je connais.
TIMEX
La fonction find () est la fonction de MongoDB, pas Mongoose. Veuillez lire la page de l'API Mongoose pour plus de détails. Vous pouvez utiliser la syntaxe définie dans la documentation MongoDB avec Mongoose. C'est pourquoi Mongoose n'a pas ses propres requêtes de tri ou d'intersection.
neebz
0

Vous pouvez également trier par _idchamp. Par exemple, pour obtenir l'enregistrement le plus récent, vous pouvez faire,

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

C'est beaucoup plus rapide aussi, car je suis plus que disposé à parier que votre datechamp n'est pas indexé.

Mike K
la source
0

Celui-ci fonctionne pour moi.

`Post.find().sort({postedon: -1}).find(function (err, sortedposts){
    if (err) 
        return res.status(500).send({ message: "No Posts." });
    res.status(200).send({sortedposts : sortedposts});
 });`
Usama Tahir
la source