Come ordinare in mangusta?


Risposte:


157

In Mongoose, un ordinamento può essere eseguito in uno dei seguenti modi:

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

5
Questa è quasi una copia semplice della risposta collegata da Francisco Presencia. Purtroppo le risposte più votate sono obsolete e inutilmente lunghe.
Iwein,

2
Questo non è del tutto corretto ad oggi. {sort: [['date', 1]]}non funzionerà, ma .sort([['date', -1]])funzionerà. Vedere questa risposta: stackoverflow.com/a/15081087/404699
steampowered

@steampowered grazie, farò una modifica, sei il benvenuto per farmi sapere o modificare se ho sbagliato.
iwein

135

Questo è il modo in cui ho ordinato di lavorare in mangusta 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
})

7
in mongoose 3 non puoi più usare Arrayper la selezione dei campi - deve essere StringoObject
pkyeck

4
a proposito, se vuoi tutti i campi, puoi semplicemente tirare nullquella sezione (almeno in 3.8)
MalcolmOcean

63

A partire da Mongoose 3.8.x:

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

Dove:

criteriapuò essere asc, desc, ascending, descending, 1, o-1


52

AGGIORNARE:

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

Provare:

Post.find().sort([['updatedAt', 'descending']]).all((posts) => {
  // do something with the array of posts
});

13
Nell'ultimo Mongoose (2.4.10) è .sort("updatedAt", -1).
Marcel Jackwerth,

43
Nel Mongoose ancora più recente (3.5.6-pre, ma sono abbastanza sicuro che sia valido per tutte le 3.x) è .sort({updatedAt: -1})o .sort('-updatedAt').
Andreas Hultgren,

2
Quindi dovresti usare exec(function (posts) {…invece diall
Buzut il

Ho un all() must be used after where() when called with these argumentsin Mongoose 4.6.5 ...
Dam Fa

25

Mongoose v5.4.3

ordina per ordine crescente

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

ordina per ordine decrescente

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

Per dettagli: https://mongoosejs.com/docs/api.html#query_Query-sort


23

Aggiornare

È meglio scrivere se questo confonde le persone; controlla la ricerca di documenti e come funzionano le query nel manuale delle manguste. Se si desidera utilizzare l'API fluente, è possibile ottenere un oggetto query non fornendo un callback al find()metodo, altrimenti è possibile specificare i parametri come indicato di seguito.

Originale

Dato un modeloggetto, secondo i documenti su Model , ecco come può funzionare per 2.4.1:

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

Si search specaspetta un oggetto, ma puoi passare nullo un oggetto vuoto.

Il secondo parametro è la lista dei campi come un array di stringhe, quindi forniresti ['field','field2']o null.

Il terzo parametro è rappresentato dalle opzioni come oggetto, che include la possibilità di ordinare il set di risultati. Dovresti usare { sort: { field: direction } }dov'è fieldla stringa fieldname test(nel tuo caso) ed directionè un numero in cui 1è crescente e -1decrescente.

Il parametro finale ( callback) è la funzione di callback che riceve la raccolta di documenti restituiti dalla query.

L' Model.find()implementazione (in questa versione) fa un'allocazione scorrevole di proprietà per gestire parametri opzionali (che è ciò che mi ha confuso!):

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


per la proiezione: dobbiamo fornire una stringa che contenga nomi di colonne separati da spazio.
maddy,

11

Questo è il modo in cui ho ordinato di lavorare in mongoose.js 2.0.4

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

10

Concatenamento con l'interfaccia del generatore di query in 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
})

Consulta i documenti per ulteriori informazioni sulle query.


4

con la versione corrente di mongoose (1.6.0) se si desidera ordinare solo per una colonna, è necessario eliminare l'array e passare l'oggetto direttamente alla funzione sort ():

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

mi ci è voluto del tempo, per farlo bene :(


Grazie. il tuo post mi ha aiutato. Anch'io ho affrontato questo.
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)
    })
})

Produzione

[ { _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 } ]

3

Ecco come sono riuscito a ordinare e popolare:

Model.find()
.sort('date', -1)
.populate('authors')
.exec(function(err, docs) {
    // code here
})


2

Altri hanno lavorato per me, ma questo ha fatto:

  Tag.find().sort('name', 1).run(onComplete);

2
Post.find().sort({updatedAt:1}).exec(function (err, posts){
...
});


1

A partire da 4.x i metodi di ordinamento sono stati modificati. Se si utilizza> 4.x. Prova a utilizzare uno dei seguenti.

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

0
Post.find().sort('updatedAt').exec((err, post) => {...});

1
Ciao e benvenuto nella community. Mentre la tua risposta può fornire una soluzione, una buona risposta richiede alcune spiegazioni. Si prega di aggiungere alcuni riferimenti e una spiegazione adeguata.
Panda,
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.