Di MongoDB, $sort
tahap pipeline agregasi mengurutkan semua dokumen input dan mengembalikannya ke pipeline dalam urutan yang diurutkan.
Sintaks
Sintaksnya seperti ini:
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
Dimana <sort order>
bisa 1
untuk menaik, -1
untuk turun, atau { $meta: "textScore" }
untuk mengurutkan berdasarkan textScore
yang dihitung metadata dalam urutan menurun.
Contoh Data
Misalkan kita memiliki koleksi yang disebut pets
dengan dokumen sebagai berikut:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
Urutkan dalam Urutan Ascending
Untuk mengurutkan dalam urutan menaik, kami menggunakan 1
untuk pengurutan.
Di bawah ini adalah contoh kueri yang menggunakan $sort
operator untuk mengurutkan koleksi itu berdasarkan weight
bidang dalam urutan menaik.
db.pets.aggregate([
{ $sort: { weight: 1 } }
])
Hasil:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
Urutkan dalam Urutan Menurun
Untuk mengurutkan dalam urutan menurun, kami menggunakan -1
untuk pengurutan.
db.pets.aggregate([
{ $sort: { weight: -1 } }
])
Hasil:
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Urutkan berdasarkan Beberapa Bidang
Untuk mengurutkan menurut lebih dari satu bidang, pisahkan setiap bidang/urutan urutan kombo dengan koma.
Contoh
db.pets.aggregate([
{ $sort: { type: 1, weight: -1, _id: 1 } }
])
Hasil:
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 } { "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
Dalam contoh ini, kami mengurutkan berdasarkan type
kolom dalam urutan menaik terlebih dahulu, kemudian dengan weight
bidang dalam urutan menurun, lalu dengan _id
bidang dalam urutan menaik.
Artinya, jika ada beberapa hewan peliharaan dengan jenis yang sama, hewan peliharaan tersebut diurutkan berdasarkan weight
dalam urutan menurun. Jika ada beberapa hewan peliharaan dengan jenis dan berat yang sama, maka hewan peliharaan tersebut diurutkan berdasarkan _id
bidang dalam urutan menaik. Jika kami tidak menyertakan _id
dalam proses penyortiran, maka hewan peliharaan dengan jenis dan berat yang sama dapat muncul dalam urutan apa pun. Ini benar setiap kali kita menjalankan kueri. Tanpa memiliki bidang pengurutan pada bidang yang unik (seperti _id
field), sangat mungkin (bahkan mungkin) bahwa hasilnya akan kembali dalam urutan yang berbeda setiap kali kueri dijalankan.
Mengurutkan Berbagai Jenis
Saat membandingkan nilai dari tipe BSON yang berbeda, MongoDB menggunakan urutan perbandingan berikut, dari terendah hingga tertinggi:
- MinKey (tipe internal)
- Nol
- Angka (int, long, double, desimal)
- Simbol, String
- Objek
- Array
- BinData
- Id Objek
- Boolean
- Tanggal
- Stempel waktu
- Ekspresi Reguler
- MaxKey (tipe internal)
Misalkan kita memiliki koleksi yang disebut posting dengan dokumen berikut:
{ "_id" : 1, "title" : "Web", "body" : "Create a website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast...", "date" : ISODate("2021-01-01T00:00:00Z") }
Perhatikan bahwa date
pertama field berisi string tanggal, sedangkan dua dokumen lainnya menggunakan objek Date.
Perhatikan juga bahwa string tanggal berisi tanggal yang sama persis dengan dokumen 3, dan tanggal ini lebih lambat dari tanggal dalam dokumen 2.
Mari kita terapkan $sort
ke date
bidang dokumen tersebut:
db.posts.aggregate([
{ $sort: { date: 1 } }
]).pretty()
Hasil:
{ "_id" : 1, "title" : "Web", "body" : "Create a website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast...", "date" : ISODate("2021-01-01T00:00:00Z") }
Dalam hal ini kami mengurutkan dalam urutan menaik, yang berarti tanggal yang lebih awal harus didahulukan. Namun, dokumen pertama kami berisi string tanggal alih-alih objek Tanggal, jadi dokumen itu muncul lebih dulu – meskipun tanggalnya lebih lambat dari tanggal di dokumen 2.
Ini dia lagi, tetapi dalam urutan menurun:
db.posts.aggregate([
{ $sort: { date: -1 } }
]).pretty()
Hasil:
{ "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
Sekali lagi, tanggal pemesanan rusak, karena tipe data yang berbeda.
Urutan Metadata Skor Teks
Anda dapat menggunakan { $meta: "textScore" }
argumen untuk mengurutkan berdasarkan skor relevansi menurun saat menggunakan $text
pencarian.
Contoh
db.posts.aggregate(
[
{ $match: { $text: { $search: "funny" } } },
{ $sort: { score: { $meta: "textScore" }, title: -1 } }
]
).pretty()
Hasil:
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z") }
Dalam hal ini, hanya satu dokumen yang cocok dengan kueri kami.
Dalam contoh ini, kami mengurutkan berdasarkan { $meta: "textScore" }
, lalu dengan title
dalam urutan menurun. Kami menggunakan score
sebagai nama bidang arbitrer, tetapi ini diabaikan oleh sistem kueri.
Melakukan $text
pencarian seperti ini mengharuskan kami membuat indeks teks. Jika tidak, sebuah IndexNotFound
kesalahan akan dikembalikan.
Mengurutkan Hasil yang Dikelompokkan
Kembali ke pets
kami koleksi, kita dapat menggunakan $sort
panggung setelah $group
tahap untuk mengurutkan sekelompok dokumen berdasarkan jumlah nilai dalam bidang tertentu.
db.pets.aggregate([
{
$match: { weight: { $lt: 30 } }
},
{
$group: { _id: "$type", count: { $sum: 1 } }
},
{
$sort : { count : -1 }
}
])
Hasil:
{ "_id" : "Cat", "count" : 3 } { "_id" : "Dog", "count" : 2 }
Namun, Anda mungkin lebih baik menggunakan $sortByCount
operator dalam kasus seperti itu.
Informasi Lebih Lanjut
Lihat dokumentasi MongoDB untuk informasi lebih lanjut.