Bagaimana cara menyortir luwak?

154

Saya tidak menemukan dokumen untuk pengubah sortir. Satu-satunya wawasan adalah dalam unit test: spec.lib.query.js # L12

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

Tapi itu tidak berhasil untuk saya:

Post.find().sort(['updatedAt', 1]);
Philippe Rathé
sumber
7
Baca jawaban ini untuk jawaban terkini.
Francisco Presencia

Jawaban:

157

Dalam bahasa Mongoose, pengurutan dapat dilakukan dengan salah satu cara berikut:

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
sumber
5
Ini hampir merupakan salinan langsung dari jawaban yang dihubungkan oleh Francisco Presencia. Sayangnya jawaban terpilih tertinggi sudah usang dan lama tidak perlu.
iwein
2
Ini tidak sepenuhnya benar pada hari ini. {sort: [['date', 1]]}tidak akan bekerja, tetapi .sort([['date', -1]])akan bekerja. Lihat jawaban ini: stackoverflow.com/a/15081087/404699
steampowered
@steampowered terima kasih, saya akan melakukan pengeditan, Anda dipersilakan untuk memberi tahu atau mengedit jika saya salah.
iwein
135

Ini adalah bagaimana saya dapat menyortir luwak 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
sumber
7
dalam luwak 3 Anda tidak dapat menggunakan Arrayuntuk pemilihan bidang lagi - harus StringatauObject
pkyeck
4
btw, jika Anda ingin semua bidang, Anda bisa menarik nullbagian itu (setidaknya dalam 3,8)
MalcolmOcean
63

Mulai dari Mongoose 3.8.x:

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

Dimana:

criteriabisa asc, desc, ascending, descending, 1, atau-1

pengguna3784764
sumber
52

MEMPERBARUI:

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

Mencoba:

Post.find().sort([['updatedAt', 'descending']]).all((posts) => {
  // do something with the array of posts
});
Eric
sumber
13
Dalam Mongoose terbaru (2.4.10) itu .sort("updatedAt", -1).
Marcel Jackwerth
43
Dalam Mongoose yang lebih baru (3.5.6-pre, tapi saya cukup yakin itu berlaku untuk semua 3.x) itu .sort({updatedAt: -1})atau .sort('-updatedAt').
Andreas Hultgren
2
Maka Anda harus menggunakan exec(function (posts) {…sebagai gantinyaall
Buzut
Saya mendapat all() must be used after where() when called with these argumentsdalam Mongoose 4.6.5 ...
Dam Fa
25

Mongoose v5.4.3

urutkan berdasarkan urutan menaik

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

urutkan berdasarkan urutan menurun

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

Untuk Detail: https://mongoosejs.com/docs/api.html#query_Query-sort

sultan aslam
sumber
23

Memperbarui

Ada tulisan yang lebih baik jika ini membingungkan orang; lihat dokumen temuan dan bagaimana kueri bekerja dalam manual luwak. Jika Anda ingin menggunakan api fasih Anda bisa mendapatkan objek permintaan dengan tidak memberikan panggilan balik ke find()metode, jika tidak, Anda dapat menentukan parameter seperti yang saya uraikan di bawah ini.

Asli

Diberikan modelobjek, per dokumen pada Model , ini adalah cara kerjanya 2.4.1:

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

Yang search specmengharapkan suatu objek, tetapi Anda bisa lewat nullatau objek kosong.

Param kedua adalah daftar bidang sebagai array string, jadi Anda akan memberikan ['field','field2']atau null.

Param ketiga adalah opsi sebagai objek, yang mencakup kemampuan untuk mengurutkan set hasil. Anda akan menggunakan di { sort: { field: direction } }mana fieldstring fieldname test(dalam kasus Anda) dan directionmerupakan nomor di mana 1naik dan -1desceding.

Param terakhir ( callback) adalah fungsi callback yang menerima kumpulan dokumen yang dikembalikan oleh kueri.

The Model.find()pelaksanaan (di versi ini) melakukan alokasi geser properti untuk menangani params opsional (yang adalah apa yang saya bingung!):

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

AJ.
sumber
untuk proyeksi: kita perlu memberikan string yang berisi nama kolom yang dipisahkan dengan spasi.
maddy
11

Ini adalah bagaimana saya dapat menyortir bekerja di mongoose.js 2.0.4

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

Rantai dengan antarmuka pembuat kueri di 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
})

Lihat dokumen untuk lebih lanjut tentang kueri.


sumber
4

dengan versi luwak (1.6.0) saat ini jika Anda hanya ingin mengurutkan berdasarkan satu kolom, Anda harus meletakkan array dan meneruskan objek langsung ke fungsi sort ():

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

Butuh waktu beberapa lama untuk melakukan ini :(

pkyeck
sumber
Terima kasih. posting Anda membantu saya. Saya juga menghadapi ini.
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)
    })
})

Keluaran

[ { _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
sumber
3

Beginilah cara saya menyortir dan mengisi:

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

Yang lain bekerja untuk saya, tetapi ini berhasil:

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

Inilah yang saya lakukan, itu berfungsi dengan baik.

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

Mulai dari 4.x metode pengurutan telah diubah. Jika Anda menggunakan> 4.x. Coba gunakan salah satu dari yang berikut ini.

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) { ... });
Sultan yang Cerah
sumber
0
Post.find().sort('updatedAt').exec((err, post) => {...});
Huỳn Tấn Lực
sumber
1
Hai dan selamat datang di komunitas. Meskipun jawaban Anda mungkin memberikan solusi, jawaban yang baik membutuhkan beberapa penjelasan. Mohon tambahkan beberapa referensi dan penjelasan yang tepat.
Panda