MongoDB saralash, limit va sahifalash

Kolleksiyada ming mahsulot bor, sahifada esa o’ntasi ko’rinadi. Qaysi o’ntasi? Odatda eng arzoni, eng yangisi yoki eng ko’p sotilgani.

find o’zi hech qanday tartibni kafolatlamaydi va hamma hujjatni tortib keladi. Bu darsda natijani tartiblash va kerakli bo’lagini olish ko’riladi.

Misollar uchun baza:

use shop
db.products.drop()
db.products.insertMany([
  { name: "O'tkan kunlar", category: "kitob", price: 45000, rating: 4.8, soldCount: 120 },
  { name: "Mehrobdan chayon", category: "kitob", price: 38000, rating: 4.5, soldCount: 85 },
  { name: "Shum bola", category: "kitob", price: 29000, rating: 4.9, soldCount: 210 },
  { name: "Daftar", category: "kanselyariya", price: 9500, rating: 3.9, soldCount: 540 },
  { name: "Ruchka", category: "kanselyariya", price: 4500, rating: 4.1, soldCount: 890 },
  { name: "Quloqchin", category: "texnika", price: 320000, rating: 4.2, soldCount: 35 },
  { name: "Klaviatura", category: "texnika", price: 180000, rating: 4.6, soldCount: 62 },
  { name: "Sichqoncha", category: "texnika", price: 95000, rating: 4.4, soldCount: 148 }
])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('671faa1b2c3d4e5f6a7b8c51'),
    '1': ObjectId('671faa1b2c3d4e5f6a7b8c52'),
    '2': ObjectId('671faa1b2c3d4e5f6a7b8c53'),
    '3': ObjectId('671faa1b2c3d4e5f6a7b8c54'),
    '4': ObjectId('671faa1b2c3d4e5f6a7b8c55'),
    '5': ObjectId('671faa1b2c3d4e5f6a7b8c56'),
    '6': ObjectId('671faa1b2c3d4e5f6a7b8c57'),
    '7': ObjectId('671faa1b2c3d4e5f6a7b8c58')
  }
}

sort — tartiblash

sort() find() natijasiga zanjir bilan qo’shiladi:

db.products.find({}, { name: 1, price: 1, _id: 0 }).sort({ price: 1 })
[
  { name: 'Ruchka', price: 4500 },
  { name: 'Daftar', price: 9500 },
  { name: 'Shum bola', price: 29000 },
  { name: 'Mehrobdan chayon', price: 38000 },
  { name: "O'tkan kunlar", price: 45000 },
  { name: 'Sichqoncha', price: 95000 },
  { name: 'Klaviatura', price: 180000 },
  { name: 'Quloqchin', price: 320000 }
]

Yo’nalish ikki qiymat bilan beriladi:

Qiymat Tartib SQL muqobili
1 O’sish bo’yicha (kichikdan kattaga) ASC
-1 Kamayish bo’yicha (kattadan kichikka) DESC
db.products.find({}, { name: 1, rating: 1, _id: 0 }).sort({ rating: -1 })
[
  { name: 'Shum bola', rating: 4.9 },
  { name: "O'tkan kunlar", rating: 4.8 },
  { name: 'Klaviatura', rating: 4.6 },
  { name: 'Mehrobdan chayon', rating: 4.5 },
  { name: 'Sichqoncha', rating: 4.4 },
  { name: 'Quloqchin', rating: 4.2 },
  { name: 'Ruchka', rating: 4.1 },
  { name: 'Daftar', rating: 3.9 }
]

Bu SQL ORDER BY darsidagi mantiqning o’zi.

Bir necha maydon bo’yicha saralash

Kategoriya bo’yicha guruhlab, ichida narx bo’yicha tartiblash:

db.products
  .find({}, { name: 1, category: 1, price: 1, _id: 0 })
  .sort({ category: 1, price: -1 })
[
  { name: 'Daftar', category: 'kanselyariya', price: 9500 },
  { name: 'Ruchka', category: 'kanselyariya', price: 4500 },
  { name: "O'tkan kunlar", category: 'kitob', price: 45000 },
  { name: 'Mehrobdan chayon', category: 'kitob', price: 38000 },
  { name: 'Shum bola', category: 'kitob', price: 29000 },
  { name: 'Quloqchin', category: 'texnika', price: 320000 },
  { name: 'Klaviatura', category: 'texnika', price: 180000 },
  { name: 'Sichqoncha', category: 'texnika', price: 95000 }
]

Maydonlar tartibi muhim: avval category bo’yicha guruhlandi, guruh ichida narx kamayish bo’yicha joylashdi.

limit — nechta hujjat kerak

db.products
  .find({}, { name: 1, soldCount: 1, _id: 0 })
  .sort({ soldCount: -1 })
  .limit(3)
[
  { name: 'Ruchka', soldCount: 890 },
  { name: 'Daftar', soldCount: 540 },
  { name: 'Shum bola', soldCount: 210 }
]

Eng ko’p sotilgan uchtasi. “Top 5”, “oxirgi 10 ta xabar” kabi ro’yxatlar shu zanjir bilan quriladi.

skip — boshidan tashlab yuborish

db.products
  .find({}, { name: 1, price: 1, _id: 0 })
  .sort({ price: 1 })
  .skip(3)
  .limit(3)
[
  { name: 'Mehrobdan chayon', price: 38000 },
  { name: "O'tkan kunlar", price: 45000 },
  { name: 'Sichqoncha', price: 95000 }
]

Birinchi uchtasi tashlandi, keyingi uchtasi olindi — bu ikkinchi sahifa.

Sahifalash

Sahifa raqamidan skip qiymati shunday hisoblanadi:

skip = (sahifa raqami - 1) × sahifadagi hujjatlar soni
Sahifa skip limit
1 0 3
2 3 3
3 6 3

Uchinchi sahifa:

db.products
  .find({}, { name: 1, price: 1, _id: 0 })
  .sort({ price: 1 })
  .skip(6)
  .limit(3)
[
  { name: 'Klaviatura', price: 180000 },
  { name: 'Quloqchin', price: 320000 }
]

Ikkita hujjat qaytdi — oxirgi sahifa to’liq bo’lmasligi normal.

Jami sahifalar sonini bilish uchun hujjatlar sanaladi:

db.products.countDocuments({})
8

Sakkizta hujjat, sahifada uchtadan — uchta sahifa.

skip katta sonlarda sekinlashadi

skip(100000) buyrug’ida MongoDB yuz ming hujjatni sanab o’tib, keyin tashlab yuboradi. Ish bajarilgan, natija esa foydalanilmagan.

Katta kolleksiyada boshqa yo’l ishlatiladi: oxirgi ko’rilgan qiymatdan davom etish.

// Birinchi sahifa
db.products.find({}, { name: 1, price: 1, _id: 0 }).sort({ price: 1 }).limit(3)
[
  { name: 'Ruchka', price: 4500 },
  { name: 'Daftar', price: 9500 },
  { name: 'Shum bola', price: 29000 }
]

Oxirgi narx 29000 edi. Keyingi sahifani shundan boshlaymiz:

db.products
  .find({ price: { $gt: 29000 } }, { name: 1, price: 1, _id: 0 })
  .sort({ price: 1 })
  .limit(3)
[
  { name: 'Mehrobdan chayon', price: 38000 },
  { name: "O'tkan kunlar", price: 45000 },
  { name: 'Sichqoncha', price: 95000 }
]

Natija skip(3) bilan bir xil, lekin baza hech nimani ortiqcha sanamadi.

Matnni saralash

Matn maydonlari alifbo bo’yicha tartiblanadi:

db.products.find({}, { name: 1, _id: 0 }).sort({ name: 1 })
[
  { name: 'Daftar' },
  { name: 'Klaviatura' },
  { name: 'Mehrobdan chayon' },
  { name: "O'tkan kunlar" },
  { name: 'Quloqchin' },
  { name: 'Ruchka' },
  { name: 'Shum bola' },
  { name: 'Sichqoncha' }
]

Amaliy mashq

Yuqoridagi shop bazasida bajaring:

  1. Mahsulotlarni narx bo’yicha o’sish tartibida saralang, so’ng -1 bilan teskarisini oling.
  2. .sort({ category: 1, price: -1 }) yozing va maydonlar tartibini almashtirib, natija qanday o’zgarishini ko’ring.
  3. .sort({ soldCount: -1 }).limit(3) bilan eng ko’p sotilgan uchtasini chiqaring.
  4. skip(0), skip(3), skip(6) bilan uch sahifani ketma-ket oling va hujjatlar takrorlanmasligini tekshiring.
  5. Shu so’rovlardan sort ni olib tashlab, natija barqaror qolish-qolmasligini kuzating.
  6. Oxirgi sahifadagi eng katta narxni yozib oling va $gt bilan keyingi sahifani skip siz oling.

5-qadam nazariyani amalga aylantiradi: sortsiz sahifalash nega ishlamasligini o’z natijangizda ko’rasiz.

Qisqacha xulosa

  • sort({ maydon: 1 }) o’sish, -1 kamayish bo’yicha tartiblaydi; boshqa qiymat xato beradi.
  • Bir necha maydon berilganda tartibi muhim — birinchisi asosiy.
  • limit(n) natijani n ta hujjat bilan cheklaydi.
  • skip(n) boshidagi n ta hujjatni tashlab yuboradi.
  • Sahifalash formulasi: skip = (sahifa - 1) × limit.
  • skip bo’lgan joyda sort majburiy — aks holda hujjatlar takrorlanadi yoki yo’qoladi.
  • Katta kolleksiyada skip sekin; oxirgi qiymatdan $gt bilan davom etish barqarorroq.

Keyingi darsda massiv maydonlar$push, $pull va massiv ichida qidirish.

Bu dars foydali bo'ldimi?

marta ko'rildi