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

pengurutan MongoDB()

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:

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ikhtisar MongoDB Atlas:Bagian Satu

  2. Pencarian Teks Penuh dan Sebagian MongoDB

  3. Bagaimana cara kerja contoh penghitungan pesan di Meteor docs?

  4. Mengapa mongoDB menggunakan objectID?

  5. Mongoose - menggunakan Populate pada array ObjectId