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!

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.


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


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.


4

Saya melakukan ini:

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

Ini akan menunjukkan hal-hal terbaru terlebih dahulu.


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

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

1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.