MongoDB hujjat, kolleksiya va BSON
Oldingi darsda birinchi hujjatni yozdingiz va u
qaytib o’qildi. Lekin insertOne qaytargan javobda ObjectId(...) degan
narsa bor edi, find() natijasi esa JSON’ga o’xshasa-da, tirnoqsiz
kalitlar bilan chiqdi.
Bu tafsilotlar tasodifiy emas. Bu darsda hujjat ichida aslida nima saqlanishini ko’ramiz.
Hujjat — maydon va qiymat juftliklari
Hujjat obyekt ga o’xshaydi: har maydonning nomi va qiymati bor.
{
_id: ObjectId('671f2c8a4e5b7d9f1a2c3e40'),
name: "O'tkan kunlar",
author: "Abdulla Qodiriy",
price: 45000,
inStock: true,
publishedYear: 1926
}
Bu yerda beshta ma’noli maydon va bitta xizmat maydoni (_id) bor.
Uch qatlam: baza → kolleksiya → hujjat
shop (baza)
├── products (kolleksiya)
│ ├── { _id: 1, name: "O'tkan kunlar", price: 45000 }
│ └── { _id: 2, name: "Futbolka", size: "M" }
├── orders (kolleksiya)
│ └── { _id: 1, total: 134000 }
└── customers (kolleksiya)
└── { _id: 1, name: "Aziz" }
Bitta serverda ko’p baza, bitta bazada ko’p kolleksiya, bitta kolleksiyada cheksiz hujjat bo’ladi.
Hozirgi bazani mongosh da shunday bilib olasiz:
db
shop
Kolleksiyalar ro’yxati:
show collections
products
BSON — JSON’ning ikkilik ko’rinishi
MongoDB hujjatlarni JSON matni sifatida emas, BSON deb ataladigan ikkilik formatda saqlaydi.
JSON bilan farqi amaliy:
| Tur | JSON | BSON |
|---|---|---|
| Matn | Bor | Bor |
| Son | Bitta umumiy tur | Int32, Int64, Double, Decimal128 |
| Mantiqiy qiymat | Bor | Bor |
| Sana | Yo’q (matn sifatida) | Date — alohida tur |
| Massiv | Bor | Bor |
| Ichma-ich obyekt | Bor | Bor |
| Yagona kalit | Yo’q | ObjectId |
Ikkinchi va to’rtinchi qatorlar muhim: JSON da sana
odatiy "2026-10-03" matni bo’lib qoladi va uni solishtirish noqulay.
BSON’da esa u haqiqiy sana — undan yil ajratib olish yoki ikki sanani
taqqoslash ishlaydi.
Ma’lumot turlarini amalda ko’rish
Turli turdagi maydonlari bor hujjat yozamiz:
db.samples.insertOne({
title: "Namuna hujjat",
count: 42,
price: 19.99,
isActive: true,
createdAt: new Date(),
tags: ["kitob", "klassika"],
author: { name: "Abdulla Qodiriy", birthYear: 1894 },
deletedAt: null
})
{
acknowledged: true,
insertedId: ObjectId('671f3a1b5d6e8f0a2b3c4d51')
}
Endi turlarini so’raymiz:
db.samples.findOne()
{
_id: ObjectId('671f3a1b5d6e8f0a2b3c4d51'),
title: 'Namuna hujjat',
count: 42,
price: 19.99,
isActive: true,
createdAt: ISODate('2026-10-03T09:14:35.221Z'),
tags: [ 'kitob', 'klassika' ],
author: { name: 'Abdulla Qodiriy', birthYear: 1894 },
deletedAt: null
}
createdAt qiymati ISODate(...) bo’lib qaytdi — matn emas, sana.
Aynan shu BSON’ning qo’shgan narsasi.
_id — har hujjatning majburiy kaliti
Har hujjatda _id maydoni bo’lishi shart. Siz yozmasangiz, MongoDB
uni o’zi qo’shadi.
Yaratilgan vaqtni undan ajratib olish mumkin:
db.samples.findOne()._id.getTimestamp()
ISODate('2026-10-03T09:14:35.000Z')
O’z _id ingizni ham berishingiz mumkin:
db.categories.insertOne({ _id: "books", title: "Kitoblar" })
{ acknowledged: true, insertedId: 'books' }
Bu yerda _id — oddiy matn. Kategoriya yoki sozlama kabi kam o’zgaradigan
ma’lumotda shunday qilish qulay: kalitni eslab qolish oson bo’ladi.
Ichma-ich obyekt va nuqtali murojaat
Yuqoridagi hujjatda author maydoni obyekt edi. Uning ichidagi
qiymatga nuqta orqali murojaat qilinadi:
db.samples.findOne({}, { "author.name": 1, _id: 0 })
{ author: { name: 'Abdulla Qodiriy' } }
Nuqtali yozuv butun bo’limda ishlaydi: filtr, yangilash va saralashda ham shunday yoziladi.
Maydon nomlash qoidalari
MongoDB maydon nomiga deyarli cheklov qo’ymaydi, lekin amaliy qoidalar bor:
| Qoida | Sabab |
|---|---|
Inglizcha va camelCase: createdAt |
Kod bilan bir uslubda bo’ladi |
$ bilan boshlanmaydi |
$ operator belgisi |
| Nuqta ishlatilmaydi | Nuqta ichma-ich yo’l ajratkichi |
_id dan boshqa maydonlar _ siz |
_ MongoDB’ning xizmat belgisi |
| Bir kolleksiyada bir xil nom bir ma’no | Filtr chalkashmaydi |
Oxirgi qoida schema-siz bazada eng muhimi: price bir hujjatda son,
boshqasida matn bo’lsa, price > 1000 filtri kutilmagan natija beradi.
Kolleksiyani qo’lda yaratish
Odatda kolleksiya birinchi yozuvda o’zi paydo bo’ladi. Lekin uni oldindan yaratish ham mumkin:
db.createCollection("reviews")
{ ok: 1 }
show collections
categories
products
reviews
samples
Bu qachon kerak bo’ladi: kolleksiyaga validatsiya qoidasi yoki hajm
chegarasi qo’ymoqchi bo’lsangiz. Oddiy holatda insertOne yetarli.
Keraksiz kolleksiyani o’chirish:
db.samples.drop()
true
Amaliy mashq
mongosh da use library bilan yangi bazaga o’ting va bajaring:
bookskolleksiyasiga bitta hujjat qo’shing:title,author,year,inStockmaydonlari bilan.db.books.findOne()bilan uni o’qing va_idqanday ko’rinishda qaytganini ko’ring._iddangetTimestamp()bilan yaratilgan vaqtni ajratib oling.- Ikkinchi hujjatni ichma-ich
publisher: { name: "...", city: "..." }obyekti bilan qo’shing. db.books.findOne({}, { "publisher.city": 1, _id: 0 })so’rovini yozing va nuqtali yo’l ishlashini ko’ring._id: "test"bilan hujjat qo’shing, so’ng aynan shu buyruqni takrorlabE11000xatosini o’z ko’zingiz bilan ko’ring.
6-qadam eng foydalisi: bu xatoni bir marta ataylab chaqirgan odam uni keyinchalik darhol taniydi.
Qisqacha xulosa
- Hujjat — maydon va qiymat juftliklari to’plami, JavaScript obyektiga o’xshaydi.
- Tuzilish uch qatlamli: baza → kolleksiya → hujjat.
- MongoDB hujjatlarni BSON ikkilik formatida saqlaydi.
- BSON JSON’ga sana,
ObjectIdva aniq son turlarini qo’shadi. - Har hujjatda
_idbo’lishi shart — yozmasangiz MongoDB o’zi qo’shadi. - Bir xil
_idikki marta yozilmaydi:E11000 duplicate keyxatosi chiqadi. - Ichma-ich maydonga nuqta orqali murojaat qilinadi va u yo’l tirnoq ichida yoziladi.
Keyingi darsda hujjat qo’shish —
insertOne va insertMany bilan ma’lumot yozish.