Di MongoDB, cursor.sort()
metode menentukan urutan kueri mengembalikan dokumen yang cocok.
sort()
metode menerima dokumen yang menentukan bidang untuk mengurutkan, dan urutan pengurutan. Urutan pengurutan dapat berupa 1
untuk menaik atau -1
untuk turun.
Anda juga dapat menentukan { $meta: "textScore" }
saat melakukan $text
pencarian, 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.find().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.find().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.find().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 funny 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, but definitely not funny...", "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 urutkan berdasarkan date
bidang dokumen tersebut:
db.posts.find().sort({ date: 1 }).pretty()
Hasil:
{ "_id" : 1, "title" : "Web", "body" : "Create a funny 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, but definitely not funny...", "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.find().sort({ date: -1 }).pretty()
Hasil:
{ "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "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 funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
Sekali lagi, tipe data yang berbeda diurutkan secara terpisah di dalam dirinya sendiri.
Urutan Metadata Skor Teks
Anda dapat menggunakan { $meta: "textScore" }
argumen untuk mengurutkan berdasarkan skor relevansi menurun saat menggunakan $text
pencarian.
Contoh
db.posts.find(
{ $text: { $search: "funny" } },
{ score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" } }
).pretty()
Hasil:
{ "_id" : 2, "title" : "Animals", "body" : "Animals are funny things...", "date" : ISODate("2020-01-01T00:00:00Z"), "score" : 0.6666666666666666 } { "_id" : 3, "title" : "Oceans", "body" : "Oceans are wide and vast, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z"), "score" : 0.6 } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z", "score" : 0.5833333333333334 }
Dalam contoh ini, kami mengurutkan berdasarkan { $meta: "textScore" }
.
Dari MongoDB 4.4 baris yang masuk { score: { $meta: "textScore" }}
adalah opsional. Mengabaikan ini akan menghilangkan score
lapangan dari hasil Oleh karena itu, kita dapat melakukan hal berikut (dari MongoDB 4.4):
db.posts.find(
{ $text: { $search: "funny" } }
).sort({ score: { $meta: "textScore" } }
).pretty()
Hasil:
{ "_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, but definitely not funny...", "date" : ISODate("2021-01-01T00:00:00Z") } { "_id" : 1, "title" : "Web", "body" : "Create a funny website with these three easy steps...", "date" : "2021-01-01T00:00:00.000Z" }
Melakukan $text
pencarian seperti ini mengharuskan kami membuat indeks teks. Jika tidak, sebuah IndexNotFound
kesalahan akan dikembalikan.
Informasi Lebih Lanjut
Lihat dokumentasi MongoDB untuk informasi lebih lanjut.