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:
- Mahsulotlarni narx bo’yicha o’sish tartibida saralang, so’ng
-1bilan teskarisini oling. .sort({ category: 1, price: -1 })yozing va maydonlar tartibini almashtirib, natija qanday o’zgarishini ko’ring..sort({ soldCount: -1 }).limit(3)bilan eng ko’p sotilgan uchtasini chiqaring.skip(0),skip(3),skip(6)bilan uch sahifani ketma-ket oling va hujjatlar takrorlanmasligini tekshiring.- Shu so’rovlardan
sortni olib tashlab, natija barqaror qolish-qolmasligini kuzating. - Oxirgi sahifadagi eng katta narxni yozib oling va
$gtbilan keyingi sahifaniskipsiz oling.
5-qadam nazariyani amalga aylantiradi: sortsiz sahifalash nega ishlamasligini o’z natijangizda ko’rasiz.
Qisqacha xulosa
sort({ maydon: 1 })o’sish,-1kamayish bo’yicha tartiblaydi; boshqa qiymat xato beradi.- Bir necha maydon berilganda tartibi muhim — birinchisi asosiy.
limit(n)natijaninta hujjat bilan cheklaydi.skip(n)boshidaginta hujjatni tashlab yuboradi.- Sahifalash formulasi:
skip = (sahifa - 1) × limit. skipbo’lgan joydasortmajburiy — aks holda hujjatlar takrorlanadi yoki yo’qoladi.- Katta kolleksiyada
skipsekin; oxirgi qiymatdan$gtbilan davom etish barqarorroq.
Keyingi darsda massiv maydonlar —
$push, $pull va massiv ichida qidirish.