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!

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.


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


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.


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.


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

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

1

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


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});
 });`
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.