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?


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).


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.


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


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


@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



5

Dengan luwak itu sesederhana:

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

4

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

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

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 :)


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