MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $sort

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:

  1. MinKey (tipe internal)
  2. Nol
  3. Angka (int, long, double, desimal)
  4. Simbol, String
  5. Objek
  6. Array
  7. BinData
  8. Id Objek
  9. Boolean
  10. Tanggal
  11. Stempel waktu
  12. Ekspresi Reguler
  13. 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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $addFields ketika $match tidak ditemukan

  2. Spring data mongodb - Opsi 'kursor' diperlukan

  3. Bagaimana Melakukan Operasi Query Dasar di MongoDB

  4. 5 Cara Mendapatkan Milidetik dari Tanggal di MongoDB

  5. Cara menanyakan koleksi sub dokumen menggunakan driver MongoDB dan C#