"MongoDB Basics" veb-seminarini oching

Do'stlar, yana bir kurs boshlandi "Ma'lumotlar bazasi" ertaga bo'lib o'tadi, shuning uchun biz an'anaviy ochiq dars o'tkazdik, uning yozuvini tomosha qilishingiz mumkin shu yerda. Bu safar biz mashhur MongoDB ma'lumotlar bazasi haqida gaplashdik: biz ba'zi nozikliklarni o'rganib chiqdik, ishlash asoslari, imkoniyatlar va arxitekturani ko'rib chiqdik. Biz ba'zi foydalanuvchi holatlariga ham to'xtalib o'tdik.

"MongoDB Basics" veb-seminarini oching

Vebinar bo'lib o'tdi Ivan Belt, Citymobil kompaniyasining serverlarni ishlab chiqish boshlig'i.

MongoDB xususiyatlari

MongoDB jadval sxemasining tavsifini talab qilmaydigan ochiq kodli hujjatga yo'naltirilgan DBMS. U NoSQL sifatida tasniflanadi va BSON (ikkilik JSON) dan foydalanadi. C++ da yozilgan va JavaScript sintaksisini qo'llab-quvvatlaydigan qutidan tashqarida kengaytirilishi mumkin. SQL-ni qo'llab-quvvatlash yo'q.

MongoDB ko'plab mashhur dasturlash tillari uchun drayverlarga ega (C, C++, C#, Go, Java, JavaScript, Perl, PHP, Python, Ruby va boshqalar). Boshqa dasturlash tillari uchun norasmiy va hamjamiyat tomonidan qo'llab-quvvatlanadigan drayverlar ham mavjud.

Keling, foydali bo'lishi mumkin bo'lgan asosiy buyruqlarni ko'rib chiqaylik.

Shunday qilib, MongoDB-ni Docker-da joylashtirish uchun, biz yozamiz:

docker run -it --rm -p 127.0.0.1:27017:27017 
--name mongo-exp-project mongo
docker exec -it mongo-exp-project mongo

Shunday bo'ladi mijozni ishga tushirish MongoDB:

"MongoDB Basics" veb-seminarini oching

Endi an'anaviyni yozamiz Salom Dunyo:

print (“Hello world!”)

"MongoDB Basics" veb-seminarini oching

Bundan keyin - siklni boshlaylik:

"MongoDB Basics" veb-seminarini oching

Siz sezganingizdek, bizdan oldin oddiy JS, va MongoDB to'liq huquqli JavaScript tarjimonidir.

MongoDB dan qachon foydalanish kerak?

Silikon vodiysidagi o'rtacha startap bir hafta oldin "HTML for Dummies" kitobini ochgan odam ekanligi haqida hikoya bor. U qaysi to'plamni tanlaydi? Ma'lum sabablarga ko'ra uning brauzerida JavaScript bo'lsa, serverda Node.js va ma'lumotlar bazasida JavaScript ham ishlayotgan bo'lsa, bu unga juda qulay ekanligiga rozi bo'ling. Bu 1-sonli nuqta.

Ikkinchidan, bor ajoyib ijro Peter Zaitsev, Rossiyadagi eng yaxshi ma'lumotlar bazasi mutaxassislaridan biri. Unda Piter MySQL va MongoDB haqida gapirib, qachon va nimadan foydalanish yaxshiroq ekanligiga alohida e'tibor beradi.

Uchinchidan, MongoDB yaxshilik bilan ajralib turishini ta'kidlamoqchiman masshtablilik - va bu ma'lumotlar bazasining asosiy xususiyatlaridan biridir. Agar siz yuk nima bo'lishini oldindan bilmasangiz, MongoDB mukammaldir. Bunga qo'shimcha ravishda, u kabi qutidan tashqari naqshlarni qo'llab-quvvatlaydi parchalanish и replikatsiya, va bularning barchasi juda shaffof tarzda amalga oshiriladi, ya'ni ishlash uchun juda qulay.

Bilan bog'liq terminologiya keyin MongoDB da:

  • ma'lumotlar bazalari ma'lumotlar bazalari (sxemalar, jadvallar to'plami);
  • MongoDB da shunday narsa bor To'plam - bu jadvalning analogi va mantiqiy ravishda ulanishi kerak bo'lgan hujjatlar to'plami;
  • hujjatlar qatorga o'xshash.

Ma'lumotlar bazasini yaratish va oddiy so'rovlar

Ma'lumotlar bazasini yaratish uchun undan foydalanishni boshlash kifoya:

use learn

"MongoDB Basics" veb-seminarini oching

Endi hujjatning kichik qo'shimchasini qilaylik. Bu, masalan, Aurora ismli yagona shoxli bo'lsin:

db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})

db - ma'lumotlar bazasiga kirish uchun global ob'ekt, ya'ni "monga" ning o'zi. Sharding uchun ishlatiladi sh, replikatsiya uchun - rs.

Ob'ekt qanday buyruqlarga ega? db:

"MongoDB Basics" veb-seminarini oching

Shunday qilib, keling, bizning buyruqimizga qaytaylik, natijada konsol bitta qator kiritilganligi haqida xabar beradi:

"MongoDB Basics" veb-seminarini oching

So'z unicorns jamoada db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) to'plamni bildiradi. E'tibor bering, biz to'plamni ta'riflamadik yoki yaratmadik, shunchaki "yakka shoxlar" yozdik, qo'shimcha qildik va bizda to'plam bor edi.

Va biz shunday qila olamiz barcha kollektsiyalarimizni oling:

db.getCollectionNames()

Va hokazo. mumkin boshqasini kiriting yig'ish:

"MongoDB Basics" veb-seminarini oching

Endi so'raylik to'liq to'plam (bizning holatimizda ma'lumotlar bazasida bir xil nomdagi ikkita unicorn haqida ma'lumot mavjudligini eslatib o'tamiz):

db.unicorns.find()

Iltimos, diqqat qiling, bu bizning JSON (ism, jins, vazn, noyob ob'ekt identifikatori mavjud):

"MongoDB Basics" veb-seminarini oching

Keling, bir xil nomli yana bir nechta yagona shoxlarni qo'shamiz:

db.unicorns.insert({name: 'Leto', gender: 'm', 
home: 'Arrakeen', worm: false}) 
db.unicorns.insert({name: 'Leto', gender: 'm', 
home: 'Arrakeen', worm: false})

Va nima bo'lganini ko'rib chiqaylik:

"MongoDB Basics" veb-seminarini oching

Ko'rib turganingizdek, bizda qo'shimcha maydonlar mavjud: uy и chuvalchang, bu Aurorada yo'q.

Keling, yana bir nechta yagona shoxlarni qo'shamiz:

db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, 
{name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, 
{name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, 
{name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}])

Shunday qilib, biz JavaScript yordamida yana to'rtta ob'ektni joylashtirdik:

"MongoDB Basics" veb-seminarini oching

Sizningcha, qaysi ma'lumotlar bazalarida pasport ma'lumotlarini saqlash qulayroq: relyatsion ma'lumotlar bazalari yoki Mongo?

Javob aniq - Mongada va yuqoridagi misol buni yaxshi ko'rsatadi. Hech kimga sir emaski, KLADR Rossiya Federatsiyasida og'riqdir. Va Monga manzillar bilan juda mos keladi, chunki siz hamma narsani massiv sifatida o'rnatishingiz mumkin va hayot ancha osonlashadi. Va bu yaxshi MongoDB uchun foydalanuvchi ishi.

Keling, yana bitta shoxlarni qo'shamiz:

db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); 
db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); 
db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); 
db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); 
db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); 
db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); 
db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); 
db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165});

"MongoDB Basics" veb-seminarini oching

Endi hujjatlarga e'tibor bering. Sifatda baraban Biz butun ob'ektlarni saqlaymiz. Unicorn nimani yaxshi ko'rishi haqida ham ma'lumot mavjud va hamma ham bu ma'lumotga ega emas. Shunday qilib, ichkarida yolg'on bor to'liq massiv.

Aytgancha, natijalarni yanada chiroyli ko'rsatish uchun siz qidiruv buyrug'ining oxiridagi usulni chaqirishingiz mumkin .pretty():

"MongoDB Basics" veb-seminarini oching

Agar olishingiz kerak bo'lsa oxirgi xato haqida ma'lumot, quyidagi buyruqdan foydalaning:

db.getLastError()

Buni har bir kiritishdan keyin qilish mumkin yoki siz Xavotir yozishni sozlashingiz mumkin. Bu haqda o'qish yaxshidir rasmiy hujjatlar, Aytgancha, Monga juda ma'lumotli. Aytgancha, u Habré-da ham mavjud yaxshi maqola bu haqida.

Keling, murakkabroq so'rovlarga o'tamiz

Aniq maydon qiymati uchun so'rov:

db.unicorns.find({gender: 'm'})

Bunday so'rovni yozish orqali biz konsol chiqishidagi barcha erkak yagona shoxlar ro'yxatini olamiz.

Siz ham qila olasiz bir vaqtning o'zida bir nechta maydonlar bo'yicha so'rov: jinsi va vazni bo'yicha:

"MongoDB Basics" veb-seminarini oching

Yuqorida, alohida e'tibor bering $gt selektori, bu sizga 700 dan ortiq og'irlikdagi barcha erkak yagona shoxlarni ko'paytirishga imkon beradi.

Tekshirishingiz mumkin maydon umuman mavjudmi?:

db.unicorns.find({vampires: {$exists: false}})

Yoki shunday:

db.unicorns.find({'parents.father': {$exists: true}})

Keyingi jamoa yagona shoxlarni olib chiqadi, ismlari A yoki a harflari bilan boshlanadigan:

db.unicorns.find({name: {$regex: "^[Aa]"}})

Endi ko'rib chiqaylik massiv qidiruvi. Savol №1: Bu buyruq nima beradi:

db.unicorns.find({loves:'apple'})

To'g'ri: olma sevadigan har bir kishi.

Quyidagi buyruq faqat o'z ichiga olgan yagona shoxli ma'lumotlarni qaytaradi faqat olma va tarvuzlar:

db.unicorns.find({loves:[ "apple", "watermelon" ]})

Va yana bir buyruq:

db.unicorns.find({loves:[ "watermelon", "apple" ]})

Bizning holatda, u hech narsani qaytarmaydi, chunki biz massivni o'tkazganimizda, birinchi element birinchisi bilan, ikkinchisi ikkinchisi bilan va hokazo solishtiriladi. Ya'ni massiv ham mos kelishi kerak. pozitsiyasi bo'yicha bu qadriyatlar.

Va bu shunday ko'rinadi "OR" operatori yordamida massiv orqali qidirish:

"MongoDB Basics" veb-seminarini oching

Quyidagi misol bizga ko'rsatadi $all operatori yordamida qidiruv. Va bu erda ketma-ketlik muhim emas:

"MongoDB Basics" veb-seminarini oching

Biz ham qila olamiz massiv hajmi bo'yicha qidirish:

"MongoDB Basics" veb-seminarini oching

Ammo hajmi birdan katta bo'lgan massivni topmoqchi bo'lsak-chi? Buning uchun operator mavjud $ qayerda, uning yordamida siz murakkabroq narsalarni yozishingiz mumkin:

db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } })

Aytgancha, agar siz mashq qilmoqchi bo'lsangiz, mana qayerda ekansan buyruqlar bilan fayl.

Kursor xususiyatlari

Keling, bir oz chetga chiqamiz va Monga xususiyatlari haqida bir necha so'z aytamiz:

  • find() va boshqa operatsiyalar ma'lumotlarni qaytarmaydi - ular "kursor" deb ataladigan narsani qaytaradi;
  • ma'lumotlarning chop etilayotganini ko'rishimiz tarjimonning ishi.

Yozilmoqda db.unicorns.find Qavslarsiz biz taklifni olamiz:

"MongoDB Basics" veb-seminarini oching

Biz so'rovlarni bajarishda davom etamiz

$in operatori ham mavjud:

db.unicorns.find({weight: {$in: [650, 704]}})

"MongoDB Basics" veb-seminarini oching

Endi yangilanish haqida gapiraylik. Misol uchun, keling, Rooooodles unicornning vaznini o'zgartiramiz:

db.unicorns.update({name: "Roooooodles"}, {weight: 2222})

Bizning harakatlarimiz natijasida hujjat butunlay yangilanadi, va unda faqat bitta belgilangan maydon qoladi:

"MongoDB Basics" veb-seminarini oching

Ya'ni, bizning ob'ektimiz uchun faqat 2222 og'irlik va, albatta, id qoladi.

yordamida vaziyatni to'g'irlashingiz mumkin $set:

db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}})

"MongoDB Basics" veb-seminarini oching

Bu ham mumkin qiymatlarni oshirish:

"MongoDB Basics" veb-seminarini oching

Va yana bor yuqoriga - yangilash va qo'shish kombinatsiyasi:

"MongoDB Basics" veb-seminarini oching

Bu qanday amalga oshirilgani haqida maydon tanlash:

"MongoDB Basics" veb-seminarini oching

"MongoDB Basics" veb-seminarini oching

Haqida bir necha so'z qo'shish qoladi o'tish и chegara:

"MongoDB Basics" veb-seminarini oching

Hamkasblar, hammasi shu, agar tafsilotlarni bilmoqchi bo'lsangiz, butun videoni tomosha qiling. Va sharhlaringizni qoldirishni unutmang!

Manba: www.habr.com

a Izoh qo'shish