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:

  1. books kolleksiyasiga bitta hujjat qo’shing: title, author, year, inStock maydonlari bilan.
  2. db.books.findOne() bilan uni o’qing va _id qanday ko’rinishda qaytganini ko’ring.
  3. _id dan getTimestamp() bilan yaratilgan vaqtni ajratib oling.
  4. Ikkinchi hujjatni ichma-ich publisher: { name: "...", city: "..." } obyekti bilan qo’shing.
  5. db.books.findOne({}, { "publisher.city": 1, _id: 0 }) so’rovini yozing va nuqtali yo’l ishlashini ko’ring.
  6. _id: "test" bilan hujjat qo’shing, so’ng aynan shu buyruqni takrorlab E11000 xatosini 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, ObjectId va aniq son turlarini qo’shadi.
  • Har hujjatda _id bo’lishi shart — yozmasangiz MongoDB o’zi qo’shadi.
  • Bir xil _id ikki marta yozilmaydi: E11000 duplicate key xatosi chiqadi.
  • Ichma-ich maydonga nuqta orqali murojaat qilinadi va u yo’l tirnoq ichida yoziladi.

Keyingi darsda hujjat qo’shishinsertOne va insertMany bilan ma’lumot yozish.

Bu dars foydali bo'ldimi?

marta ko'rildi