Dalam bahasa Mongoose, bagaimana cara saya mengurutkan berdasarkan tanggal? (node.js)

161

katakanlah saya menjalankan kueri ini dalam bahasa Mongoose:

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

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

Ini tidak berfungsi!

TIMEX
sumber

Jawaban:

429

Penyortiran dalam bahasa Mongoose telah berkembang seiring rilis sehingga beberapa dari jawaban ini tidak lagi valid. Pada rilis 4.1.x dari Mongoose, jenis menurun di datelapangan dapat dilakukan dengan salah satu cara berikut:

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

Untuk semacam ascending, menghilangkan -awalan pada versi string atau penggunaan nilai-nilai 1, ascatau ascending.

JohnnyHK
sumber
1
+1 untuk menunjukkan berbagai cara yang dapat dilakukan. Namun, saya tidak dapat menemukan di dokumen bahwa Query # find akan menerima banyak argumen. Tanda tangan Query#find([criteria], [callback]). Saya pikir mungkin ada beberapa jabat tangan rahasia yang mengatakan "kriteria" bisa sampai tiga argumen, tetapi daftar jenis sebagai "Objek".
Nateowami
@Nateowami Anda sedang mencari findmetode yang salah dalam dokumen. Lihat Model.find.
JohnnyHK
1
Kamu benar. Saya melihat mereka menggunakan Module#propertynotasi dan mencari #find. Tampaknya tidak ada cara mudah untuk menavigasi atau mencari dokumen. Pencarian untuk menemukan hasil 187 hasil.
Nateowami
2
Anda juga dapat mengurutkan berdasarkan _idbidang. Misalnya, untuk mendapatkan catatan terbaru, Anda dapat melakukan:await db.collection.findOne().sort({ _id: -1 });
Mike K
53

Jawaban yang benar adalah:

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

});
TIMEX
sumber
13
sintaks sortir yang diperbarui untuk contoh di atas adalah: sort ('- date') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel
3
Yang ini tidak berhasil untuk saya. Saya mendapat pesan kesalahan "User.find (...). Sort (...). ExecFind bukan sebuah fungsi"
Sandip Subedi
12

Berhubungan dengan masalah ini hari ini menggunakan Mongoose 3.5 (.2) dan tidak ada jawaban yang cukup membantu saya memecahkan masalah ini. Cuplikan kode berikut berfungsi

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

Anda dapat mengirim parameter standar apa pun yang Anda perlukan find()(mis. Tempat klausa dan bidang kembali) tetapi tidak ada panggilan balik. Tanpa panggilan balik, ia mengembalikan objek kueri yang Anda rantai sort(). Anda perlu menelepon find()lagi (dengan atau tanpa lebih banyak parameter - seharusnya tidak memerlukan alasan efisiensi) yang memungkinkan Anda untuk mendapatkan hasil yang ditetapkan dalam panggilan balik Anda.

Jimmy Hillis
sumber
4

Saya melakukan ini:

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

Ini akan menunjukkan hal-hal terbaru terlebih dahulu.

Nuh
sumber
1
$orderbytidak digunakan lagi dalam MongoDB 3.2 sehingga tidak boleh digunakan lagi.
JohnnyHK
4
Post.find().sort({date:-1}, function(err, posts){
});

Harus bekerja juga

EDIT:

Anda juga dapat mencoba menggunakan ini jika Anda mendapatkan kesalahan sort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});
lynx_vbg
sumber
1
ini memberi saya kesalahan:Error: sort() only takes 1 Argument
mrid
@LukeXF silakan lihat jawaban yang diperbarui. saya harap ini membantu Anda :)
mrid
@mrid seharusnya seperti: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi
2

Solusi singkat:

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

Room.find(query, projection, options).exec(function(err, docs) { ... });
davidsonsns
sumber
1

Lihat apakah ini membantu> Bagaimana cara mengurutkan luwak?

Baca juga ini> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

neebz
sumber
Metode pertama tidak bekerja. Itu hanya hang ... Saya pikir itu karena pembaruan dalam luwak .... Dan metode ke-2 hanyalah dokumen luwak, yang saya ketahui.
TIMEX
Fungsi find () adalah fungsi MongoDB, bukan Mongoose. Silakan baca halaman Mongoose API untuk lebih jelasnya Anda dapat menggunakan sintaks yang didefinisikan dalam MongoDB docs dengan Mongoose. Itu sebabnya Mongoose tidak memiliki permintaan penyortiran atau intersect sendiri.
neebz
0

Anda juga dapat mengurutkan berdasarkan _idbidang. Misalnya, untuk mendapatkan catatan terbaru, Anda dapat melakukannya,

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

Ini jauh lebih cepat juga, karena saya lebih dari berani bertaruh bahwa datebidang Anda tidak diindeks.

Mike K.
sumber