2-bo‘lim
mongosh bilan ishlash
Serverga ulanish, use bilan baza tanlash, to'plam yaratish, birinchi hujjatlarni qo'shish va ro'yxatlarni ko'rish buyruqlari.
Ushbu bo‘lim mundarijasi
mongosh - MongoDB ning rasmiy buyruq qatori mijozi. U
JavaScript muhiti ustiga qurilgan, shuning uchun unda
o'zgaruvchi e'lon qilish va sikl yozish ham mumkin.
Ulanish #
Eng oddiy holatda mongosh o'z kompyuteringizdagi serverga ulanadi:
mongosh
To'liq manzil bilan ulanish:
mongosh "mongodb://127.0.0.1:27017"
| Qism | Ma'nosi |
|---|---|
mongodb:// | Protokol nomi |
127.0.0.1 | Server manzili |
27017 | Port - MongoDB ning odatiy porti |
Ulangandan keyin taklif satri quyidagicha ko'rinadi:
test>
test - bu hozir tanlangan baza nomi.
Baza tanlash #
use dokon
switched to db dokon
use ishlaydiuse dokon yozganda MongoDB "bunday baza yo'q" demaydi.
Aksincha, u shu nomni eslab qoladi va birinchi hujjat
yozilganda bazani o'zi yaratadi.
To'plamlar ham xuddi shunday: db.kitob.insertOne(...)
yozilganda kitob to'plami avtomatik paydo bo'ladi.
| Amal | Qachon haqiqatan yaratiladi |
|---|---|
use dokon | Birinchi yozuvda |
db.kitob.insertOne(...) | Darhol |
db.kitob.find() | Hech qachon - o'qish yaratmaydi |
Shuning uchun show dbs ro'yxatida yangi baza darrov
ko'rinmasligi mumkin. Bu xato emas: u hali bo'sh.
Birinchi hujjatlar #
Bazaga uchta kitob qo'shamiz. Shu ma'lumot bu bobdagi barcha misollarda ishlatiladi:
db.kitob.insertMany([
{ _id: 1, nom: "Otkan kunlar", narx: 85000 },
{ _id: 2, nom: "Navoiy", narx: 95000 },
{ _id: 3, nom: "Ufq", narx: 64000 }
])
Xuddi shu usulda ikkinchi to'plamni ham yaratish mumkin -
use yoki create buyrug'i kerak emas:
db.mijoz.insertMany([
{ _id: 1, ism: "Husanboy", shahar: "Namangan" },
{ _id: 2, ism: "Malika", shahar: "Namangan" }
])
{ acknowledged: true, insertedIds: { '0': 1, '1': 2 } }
insertedIds - qo'shilgan hujjatlarning kalitlari. Biz
_id ni o'zimiz berganimiz uchun ular oddiy sonlar.
O'qish #
db.kitob.find()
[
{ _id: 1, nom: 'Otkan kunlar', narx: 85000 },
{ _id: 2, nom: 'Navoiy', narx: 95000 },
{ _id: 3, nom: 'Ufq', narx: 64000 }
]
Bitta hujjatni olish:
db.kitob.findOne({ nom: "Navoiy" })
{ _id: 2, nom: 'Navoiy', narx: 95000 }
find va findOne farqiIkkalasi bir xil ko'rinsa ham, qaytaradigan narsasi boshqacha:
| Metod | Qaytaradi | Hech narsa topilmasa |
|---|---|---|
find() | Kursor - hujjatlar oqimi | Bo'sh natija |
findOne() | Bitta hujjat yoki null | null |
Amaliy farq: findOne() natijasidan darhol maydon olish
mumkin - doc.narx. find() natijasidan esa olib
bo'lmaydi, chunki u kursor.
Dastur yozayotganda esa yana bir farq bor: find()
natijasini aylanib chiqish kerak, findOne() esa tayyor
obyekt beradi.
Ro'yxatlar #
Server, baza va to'plam haqida ma'lumot olish uchun qisqa buyruqlar bor:
| Buyruq | Nima ko'rsatadi |
|---|---|
show dbs | Serverdagi barcha bazalar |
show collections | Joriy bazadagi to'plamlar |
db | Joriy baza nomi |
db.kitob.countDocuments() | To'plamdagi hujjatlar soni |
db.stats() | Baza hajmi haqida ma'lumot |
db.getName()
db.kitob.countDocuments()
db.getCollectionNames()
dokon
3
[ 'kitob' ]
Hujjatni o'zgartirish va o'chirish #
db.kitob.updateOne({ _id: 3 }, { $set: { narx: 70000 } })
db.kitob.findOne({ _id: 3 })
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
{ _id: 3, nom: 'Ufq', narx: 70000 }
db.kitob.countDocuments()
db.kitob.deleteOne({ _id: 3 })
db.kitob.countDocuments()
3
{ acknowledged: true, deletedCount: 1 }
2
mongosh - bu JavaScript #
Oddiy mijozdan farqli, mongosh da to'liq dastur yozish mumkin:
const chegara = 80000
const qimmat = db.kitob.find({ narx: { $gte: chegara } }).toArray()
qimmat.map(k => k.nom + " - " + (k.narx / 1000) + " ming")
[ 'Otkan kunlar - 85 ming', 'Navoiy - 95 ming' ]
toArray() kursorni oddiy JavaScript massiviga aylantiradi -
shundan keyin map, filter kabi odatiy metodlar ishlaydi.
toArray() ni katta to'plamda ishlatmangtoArray() barcha hujjatlarni xotiraga yuklaydi.
Uch dona hujjatda bu muammo emas. Bir million hujjatda esa mongosh (yoki dasturingiz) xotirani to'ldirib to'xtab qolishi mumkin.
To'g'ri yo'llar:
| Maqsad | Yechim |
|---|---|
| Faqat bir nechtasi kerak | .limit(20) |
| Hammasini aylanib chiqish | forEach - hujjatlar birma-bir keladi |
| Faqat son kerak | countDocuments() |
| Umumlashtirish kerak | Agregatsiya quvuri (12-bob) |
Kursorning butun mohiyati shunda: u hujjatlarni kerak bo'lganda olib keladi, hammasini oldindan emas.
Foydali qulayliklar #
| Amal | Buyruq |
|---|---|
| Yordam olish | db.kitob.help() |
| Chiqishni tekislash | .pretty() (8.x da avtomatik) |
| Oxirgi buyruqni takrorlash | Yuqoriga strelka |
| Chiqishni tozalash | cls |
| Chiqishdan chiqish | .exit yoki Ctrl+D |
| Fayldan skript ishlatish | mongosh --file skript.js |
mongoshni ishga tushiring va ulanganini tekshiring.use dokonbilan yangi baza tanlang.show dbsda u ko'rinadimi - tekshiring va sababini yozing.insertManybilan uchta hujjat qo'shing.- Endi
show dbsda baza paydo bo'ldimi - qayta tekshiring. find()vafindOne()natijalarini solishtiring.updateOnebilan bitta narxni o'zgartiring.deleteOnebilan bitta hujjatni o'chiring.countDocuments()bilan qolgan sonni bilib oling.toArray()nima uchun xavfli bo'lishi mumkinligini tushuntiring.
Xulosa #
mongosh- MongoDB ning rasmiy mijozi va to'liq JavaScript muhiti.- Odatiy port - 27017.
use <baza>bazani tanlaydi; baza va to'plam birinchi yozuvda yaratiladi.- Shuning uchun bo'sh baza
show dbsro'yxatida ko'rinmaydi. insertOnevainsertManyhujjat qo'shadi.find()kursor,findOne()esa bitta hujjat yokinullqaytaradi.updateOneyangilaydi,deleteOneo'chiradi - ikkalasi ham filtr oladi.toArray()hammasini xotiraga yuklaydi - katta to'plamdalimityokiforEachishlating.- Kursorning mohiyati - hujjatlarni kerak bo'lganda olib kelish.
show collections,db.getName(),countDocuments()- kundalik tekshiruv buyruqlari.
Keyingi bo'limda hujjat ichida qanday turlar saqlanishini - BSON turlarini ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.