Bagaimana cara mengurutkan koleksi berdasarkan tanggal di MongoDB?

125

Saya menggunakan MongoDB dengan Node.JS. Saya memiliki koleksi yang berisi tanggal dan baris lainnya. Tanggal adalah Dateobjek JavaScript .

Bagaimana cara mengurutkan koleksi ini berdasarkan tanggal?

mengalir
sumber
1
sederhana, collection.find (). sort ({datefield: 1}, function (err, cursor) {...}); atau Anda juga bisa menggunakan collection.find (). sort ({datefield: -1}, function (err, cursor) {...});
Atul Jain
Perhatikan bahwa Anda mungkin tidak memerlukan datekolom: stackoverflow.com/questions/5125521/…
phil294

Jawaban:

187

Sedikit modifikasi untuk jawaban @JohnnyHK

collection.find().sort({datefield: -1}, function(err, cursor){...});

Dalam banyak kasus penggunaan kami ingin memiliki catatan terbaru untuk dikembalikan (seperti untuk pembaruan / sisipan terbaru).

Sushant Gupta
sumber
1
Apa yang ingin Anda masukkan ke dalam fungsinya? Hanya mencoba mengurutkan Dateobjek tanpa fungsi tidak berhasil untuk saya di 2.6.3.
Sam Brightman
@ SamBrightman Fungsi itu hanyalah panggilan balik. Apa pun yang ingin Anda lakukan dengan hasil kueri, letakkan logika tersebut di dalam callback Anda. Anda dapat membaca lebih lanjut tentang apa itu callback dan bagaimana cara kerjanya untuk mempelajari pemrograman berbasis peristiwa.
Sushant Gupta
Tentu, saya tahu apa itu panggilan balik. Saya hanya melihat persyaratan penyortiran di pertanyaan dan semua jawaban memberikan panggilan balik. Pada saat yang sama, penyortiran tidak berhasil untuk saya, jadi saya pikir mungkin Anda harus melakukan pekerjaan tambahan dalam fungsi tersebut.
Sam Brightman
1
@SamBrightEmail Oh ok. Untuk kenyamanan Anda bisa eksplisit dan berantai seperticollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta
5
dikatakan sort () hanya membutuhkan 1 Argumen
Jitendra Pancholi
39

Menyortir menurut tanggal tidak memerlukan sesuatu yang istimewa. Cukup urutkan menurut kolom tanggal koleksi yang diinginkan.

Diperbarui untuk driver asli 1.4.28 node.js, Anda dapat mengurutkan naik datefieldmenggunakan salah satu cara berikut:

collection.find().sort({datefield: 1}).toArray(function(err, docs) {...});
collection.find().sort('datefield', 1).toArray(function(err, docs) {...});
collection.find().sort([['datefield', 1]]).toArray(function(err, docs) {...});
collection.find({}, {sort: {datefield: 1}}).toArray(function(err, docs) {...});
collection.find({}, {sort: [['datefield', 1]]}).toArray(function(err, docs) {...});

'asc'atau 'ascending'bisa juga digunakan sebagai pengganti 1.

Untuk semacam menurun, penggunaan 'desc', 'descending'atau -1di tempat 1.

JohnnyHK
sumber
Saya menerapkan solusi di atas pada bidang nama pengguna, Ini berfungsi dengan baik tetapi peka huruf besar kecil Bagaimana cara mengabaikannya?
Rahul Matte
Jawaban benar dengan multi way (y)
abdulbarik
30
db.getCollection('').find({}).sort({_id:-1}) 

Ini akan mengurutkan koleksi Anda dalam urutan menurun berdasarkan tanggal penyisipan

Rich Rajah
sumber
16

Jawaban Sushant Gupta agak ketinggalan jaman dan tidak berfungsi lagi.

Cuplikan berikut seharusnya seperti ini sekarang:

collection.find({}, {"sort" : ['datefield', 'asc']} ).toArray(function(err,docs) {});

krikara
sumber
@Tokopedia Saya tidak ingat skenario pastinya, tetapi musim panas lalu saya mencoba membuat jenis itu bekerja dengan cuplikan Sushant dan itu tidak berhasil untuk saya. Mungkin karena kurang toArraypart.
krikara
Ini sebenarnya adalah jawaban yang salah, memberikan hasil yang salah di node.js
David A
12

Ini berhasil untuk saya:

collection.find({}, {"sort" : [['datefield', 'asc']]}, function (err, docs) { ... });

Menggunakan Node.js, Express.js, dan Monk

GoldfishGrenade
sumber
5

Dengan luwak itu sesederhana:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})
emil.c
sumber
4

Kotak tambahan [] Braket diperlukan untuk menyortir parameter agar bekerja.

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});
DB Prasad
sumber
2

jika format tanggal Anda seperti ini: 14/02/1989 ----> Anda mungkin menemukan beberapa masalah

Anda perlu menggunakan ISOdate seperti ini:

var start_date = new Date(2012, 07, x, x, x); 

-----> hasilnya ------> ISODate ("2012-07-14T08: 14: 00.201Z")

sekarang gunakan saja query seperti ini:

 collection.find( { query : query ,$orderby :{start_date : -1}} ,function (err, cursor) {...}

itu dia :)

Amine_Dev
sumber
2

Dengan luwak saya tidak dapat menggunakan 'toArray', dan mendapatkan kesalahan: TypeError: Collection.find(...).sort(...).toArray is not a function. Fungsi toArray ada di kelas Cursor dari driver Native MongoDB NodeJS ( referensi ).

Juga sort menerima hanya satu parameter, jadi Anda tidak bisa melewatkan fungsi Anda di dalamnya.

Ini berhasil untuk saya (seperti yang dijawab oleh Emil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Pransh Tiwari
sumber