Comment trier la mangouste?

154

Je ne trouve pas de doc pour le modificateur de tri. Le seul aperçu se trouve dans les tests unitaires: spec.lib.query.js # L12

writer.limit(5).sort(['test', 1]).group('name')

Mais ça ne marche pas pour moi:

Post.find().sort(['updatedAt', 1]);
Philippe Rathé
la source
7
Lisez cette réponse pour une réponse à jour.
Francisco Presencia

Réponses:

157

Dans Mongoose, un tri peut être effectué de l'une des manières suivantes:

Post.find({}).sort('test').exec(function(err, docs) { ... });
Post.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Post.find({}).sort({test: 1}).exec(function(err, docs) { ... });
Post.find({}, null, {sort: {date: 1}}, function(err, docs) { ... });
iwein
la source
5
Ceci est presque une copie directe de la réponse liée par Francisco Presencia. Malheureusement, les réponses les plus votées sont dépassées et inutilement longues.
iwein
2
Ce n'est pas tout à fait correct à ce jour. {sort: [['date', 1]]}ne fonctionnera pas, mais .sort([['date', -1]])fonctionnera. Voir cette réponse: stackoverflow.com/a/15081087/404699
steampowered
@steampowered merci, je vais faire une modification, vous êtes les bienvenus pour me le faire savoir ou modifier si je me suis trompé.
iwein
135

C'est ainsi que j'ai réussi à travailler dans mongoose 2.3.0 :)

// Find First 10 News Items
News.find({
    deal_id:deal._id // Search Filters
},
['type','date_added'], // Columns to Return
{
    skip:0, // Starting Row
    limit:10, // Ending Row
    sort:{
        date_added: -1 //Sort by Date Added DESC
    }
},
function(err,allNews){
    socket.emit('news-load', allNews); // Do something with the array of 10 objects
})
Derek Bredensteiner
la source
7
dans mangouste 3, vous ne pouvez plus utiliser Arraypour la sélection de champ - ce doit être StringouObject
pkyeck
4
btw, si vous voulez tous les champs, vous pouvez simplement extraire nullcette section (au moins en 3.8)
MalcolmOcean
63

À partir de Mongoose 3.8.x:

model.find({ ... }).sort({ field : criteria}).exec(function(err, model){ ... });

Où:

criteriapeut être asc, desc, ascending, descending, 1ou-1

user3784764
la source
52

METTRE À JOUR:

Post.find().sort({'updatedAt': -1}).all((posts) => {
  // do something with the array of posts
});

Essayer:

Post.find().sort([['updatedAt', 'descending']]).all((posts) => {
  // do something with the array of posts
});
Eric
la source
13
Dans le dernier Mongoose (2.4.10), c'est .sort("updatedAt", -1).
Marcel Jackwerth
43
Dans le dernier Mongoose encore plus récent (3.5.6-pre, mais je suis presque sûr qu'il est valable pour tous les 3.x) c'est .sort({updatedAt: -1})ou .sort('-updatedAt').
Andreas Hultgren
2
Ensuite, vous devriez utiliser à la exec(function (posts) {…place deall
Buzut
J'ai un all() must be used after where() when called with these argumentsdans Mongoose 4.6.5 ...
Dam Fa
25

Mongoose v5.4.3

trier par ordre croissant

Post.find({}).sort('field').exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'asc' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'ascending' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: 1 }).exec(function(err, docs) { ... });

Post.find({}, null, {sort: { field : 'asc' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : 'ascending' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : 1 }}), function(err, docs) { ... });

trier par ordre décroissant

Post.find({}).sort('-field').exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'desc' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'descending' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: -1 }).exec(function(err, docs) { ... });


Post.find({}, null, {sort: { field : 'desc' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : 'descending' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : -1 }}), function(err, docs) { ... });

Pour plus de détails: https://mongoosejs.com/docs/api.html#query_Query-sort

sultan aslam
la source
23

Mettre à jour

Il y a une meilleure rédaction si cela déroute les gens; consultez la recherche de documents et le fonctionnement des requêtes dans le manuel de la mangouste. Si vous souhaitez utiliser l'API fluide, vous pouvez obtenir un objet de requête en ne fournissant pas de rappel à la find()méthode, sinon vous pouvez spécifier les paramètres comme je l'explique ci-dessous.

Original

Étant donné un modelobjet, selon les documents sur Model , voici comment cela peut fonctionner pour 2.4.1:

Post.find({search-spec}, [return field array], {options}, callback)

L' search specattend un objet, mais vous pouvez passer nullou un objet vide.

Le deuxième paramètre est la liste des champs sous forme de tableau de chaînes, vous devez donc fournir ['field','field2']ou null.

Le troisième paramètre est les options en tant qu'objet, ce qui inclut la possibilité de trier l'ensemble de résultats. Vous utiliseriez { sort: { field: direction } }fieldest la chaîne fieldname test(dans votre cas) et directionest un nombre où 1est croissant et -1décroissant.

Le paramètre final ( callback) est la fonction de rappel qui reçoit la collection de documents renvoyée par la requête.

L' Model.find()implémentation (dans cette version) fait une allocation glissante de propriétés pour gérer les paramètres optionnels (ce qui m'a dérouté!):

Model.find = function find (conditions, fields, options, callback) {
  if ('function' == typeof conditions) {
    callback = conditions;
    conditions = {};
    fields = null;
    options = null;
  } else if ('function' == typeof fields) {
    callback = fields;
    fields = null;
    options = null;
  } else if ('function' == typeof options) {
    callback = options;
    options = null;
  }

  var query = new Query(conditions, options).select(fields).bind(this, 'find');

  if ('undefined' === typeof callback)
    return query;

  this._applyNamedScope(query);
  return query.find(callback);
};

HTH

UN J.
la source
pour la projection: nous devons fournir une chaîne contenant des noms de colonnes séparés par un espace.
maddy
11

C'est ainsi que j'ai pu travailler dans mongoose.js 2.0.4

var query = EmailModel.find({domain:"gmail.com"});
query.sort('priority', 1);
query.exec(function(error, docs){
  //...
});
Logiciel Salida
la source
10

Chaînage avec l'interface du générateur de requêtes dans Mongoose 4.

// Build up a query using chaining syntax. Since no callback is passed this will create an instance of Query.
var query = Person.
    find({ occupation: /host/ }).
    where('name.last').equals('Ghost'). // find each Person with a last name matching 'Ghost'
    where('age').gt(17).lt(66).
    where('likes').in(['vaporizing', 'talking']).
    limit(10).
    sort('-occupation'). // sort by occupation in decreasing order
    select('name occupation'); // selecting the `name` and `occupation` fields


// Excute the query at a later time.
query.exec(function (err, person) {
    if (err) return handleError(err);
    console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation) // Space Ghost is a talk show host
})

Consultez la documentation pour en savoir plus sur les requêtes.


la source
4

avec la version actuelle de mongoose (1.6.0) si vous ne voulez trier que par une colonne, vous devez déposer le tableau et passer l'objet directement à la fonction sort ():

Content.find().sort('created', 'descending').execFind( ... );

m'a pris du temps, pour bien faire les choses :(

pkyeck
la source
Merci. votre message m'a aidé. Moi aussi, j'ai fait face à cela.
user644745
4
app.get('/getting',function(req,res){
    Blog.find({}).limit(4).skip(2).sort({age:-1}).then((resu)=>{
        res.send(resu);
        console.log(resu)
        // console.log(result)
    })
})

Production

[ { _id: 5c2eec3b8d6e5c20ed2f040e, name: 'e', age: 5, __v: 0 },
  { _id: 5c2eec0c8d6e5c20ed2f040d, name: 'd', age: 4, __v: 0 },
  { _id: 5c2eec048d6e5c20ed2f040c, name: 'c', age: 3, __v: 0 },
  { _id: 5c2eebf48d6e5c20ed2f040b, name: 'b', age: 2, __v: 0 } ]
koteswararao pv
la source
3

Voici comment j'ai réussi à trier et à remplir:

Model.find()
.sort('date', -1)
.populate('authors')
.exec(function(err, docs) {
    // code here
})
Mark Gia Bao Nguyen
la source
3
Post.find().sort({updatedAt: 1});
chovy
la source
2

D'autres ont fonctionné pour moi, mais cela a fonctionné:

  Tag.find().sort('name', 1).run(onComplete);
FrederickCuisinier
la source
2
Post.find().sort({updatedAt:1}).exec(function (err, posts){
...
});
gtsouk
la source
1

C'est ce que j'ai fait, ça marche bien.

User.find({name:'Thava'}, null, {sort: { name : 1 }})
Thavaprakash Swaminathan
la source
1

À partir de la version 4.x, les méthodes de tri ont été modifiées. Si vous utilisez> 4.x. Essayez d'utiliser l'un des éléments suivants.

Post.find({}).sort('-date').exec(function(err, docs) { ... });
Post.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Post.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Post.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Post.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Post.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Post.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });
Sunny Sultan
la source
0
Post.find().sort('updatedAt').exec((err, post) => {...});
Huỳnh Tấn Lực
la source
1
Bonjour et bienvenue dans la communauté. Bien que votre réponse puisse fournir une solution, une bonne réponse nécessite quelques explications. Veuillez ajouter quelques références et une explication appropriée.
Panda