Otvoreni webinar "Osnove MongoDB"

Prijatelji, pokretanje još jednog kursa "baza podataka" održat će se sutra, pa smo održali tradicionalni otvoreni čas, čiji snimak možete pogledati ovdje. Ovaj put smo govorili o popularnoj bazi podataka MongoDB: proučili smo neke od suptilnosti, pogledali osnove rada, mogućnosti i arhitekture. Dotakli smo se i nekih korisničkih slučajeva.

Otvoreni webinar "Osnove MongoDB"

Održan je webinar Ivan Belt, šef razvoja servera u Citymobilu.

MongoDB karakteristike

MongoDB je DBMS otvorenog koda orijentiran na dokumente koji ne zahtijeva opis sheme tablice. Klasifikovan je kao NoSQL i koristi BSON (binarni JSON). Skalabilan iz kutije, napisan u C++ i podržava JavaScript sintaksu. Nema SQL podrške.

MongoDB ima drajvere za mnoge popularne programske jezike (C, C++, C#, Go, Java, JavaScript, Perl, PHP, Python, Ruby, itd.). Postoje i nezvanični drajveri za druge programske jezike koje podržava zajednica.

Pa, pogledajmo osnovne komande koje mogu biti korisne.

Dakle, da implementirate MongoDB u Docker, mi pišemo:

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

Tako se to dešava pokretanje klijenta MongoDB:

Otvoreni webinar "Osnove MongoDB"

Hajde da napišemo ono tradicionalno Hello World:

print (“Hello world!”)

Otvoreni webinar "Osnove MongoDB"

Nakon toga - počnimo ciklus:

Otvoreni webinar "Osnove MongoDB"

Kao što ste primetili, pred nama obični JS, a MongoDB je punopravni JavaScript interpreter.

Kada koristiti MongoDB?

Postoji priča da je prosječan startup u Silicijumskoj dolini osoba koja je prije nedelju dana otvorila knjigu “HTML za lutke”. Koji će stack izabrati? Slažete se da mu je veoma zgodno kada, iz očiglednih razloga, ima JavaScript u svom pretraživaču, Node.js radi na serveru, a JavaScript takođe radi u bazi podataka. Ovo je tačka broj 1.

Drugo, postoji odlična izvedba Peter Zaitsev, jedan od najboljih stručnjaka za baze podataka u Rusiji. U njemu Peter govori o MySQL-u i MongoDB-u, obraćajući posebnu pažnju na to kada i šta je najbolje koristiti.

Treće, želio bih da naglasim da MongoDB karakteriše dobro skalabilnost - a ovo je jedna od ključnih karakteristika baze podataka. Ako ne znate unaprijed koliko će biti opterećenje, MongoDB je savršen. Osim toga, podržava gotove obrasce kao što su shading и replikacija, a sve je to urađeno prilično transparentno, odnosno vrlo je zgodno za rad.

Što se tiče terminologija u MongoDB onda:

  • baze podataka su baze podataka (šeme, zbirke tabela);
  • u MongoDB postoji takva stvar kao zbirka - ovo je analog tabele i skupa dokumenata koji bi, logično, trebali biti povezani;
  • dokumenti su analogni nizu.

Kreiranje baze podataka i jednostavni upiti

Da biste kreirali bazu podataka, trebate je samo početi koristiti:

use learn

Otvoreni webinar "Osnove MongoDB"

Sada napravimo mali umetak dokumenta. Neka to bude, na primjer, jednorog po imenu Aurora:

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

db - globalni objekat za pristup bazi podataka, odnosno, u stvari, sama „monga“. Koristi se za šarding sh, za replikaciju - rs.

Koje komande ima objekat? db:

Otvoreni webinar "Osnove MongoDB"

Dakle, vratimo se našoj komandi, kao rezultat toga, konzola će prijaviti da je umetnuta jedna linija:

Otvoreni webinar "Osnove MongoDB"

Reč unicorns u timu db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) označava kolekciju. Napominjemo da nismo opisali niti kreirali kolekciju, već smo jednostavno napisali 'jednoroze', napravili insert i imali smo kolekciju.

I ovako možemo nabavite sve naše kolekcije:

db.getCollectionNames()

I tako dalje. Može ubacite još jednu kolekcija:

Otvoreni webinar "Osnove MongoDB"

Sada da pitamo kompletna kolekcija (podsjećamo da u našem slučaju baza podataka već sadrži informacije o dva jednoroga s istim imenom):

db.unicorns.find()

Imajte na umu, ovdje je naš JSON (postoji ime, spol, težina, neki jedinstveni identifikator objekta):

Otvoreni webinar "Osnove MongoDB"

Sada ubacimo još par jednoroga sa istim imenima:

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

I da vidimo šta se desilo:

Otvoreni webinar "Osnove MongoDB"

Kao što vidite, imamo dodatna polja: kući и crv, koju Aurora nema.

Dodajmo još nekoliko jednoroga:

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}])

Dakle, ubacili smo još četiri objekta koristeći JavaScript:

Otvoreni webinar "Osnove MongoDB"

Po vašem mišljenju, u kojim je bazama podataka pogodnije čuvati podatke o pasošu: relacijske baze podataka ili Mongo?

Odgovor je očigledan - u Mongi, a gornji primjer to dobro pokazuje. Nije tajna da je KLADR muka u Ruskoj Federaciji. I Monga se jako dobro uklapa sa adresama, jer sve možete postaviti kao niz i život će biti mnogo lakši. I to je dobro Slučaj korisnika za MongoDB.

Dodajmo još jednoroga:

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});

Otvoreni webinar "Osnove MongoDB"

Sada obratite pažnju na dokumente. As dob Čuvamo čitave predmete. Postoje i informacije o tome šta jednorog voli, a nemaju svi tu informaciju. Dakle, unutarnje laži puni niz.

Usput, da biste ljepše prikazali rezultate, možete pozvati metodu na kraju komande pretraživanja .pretty():

Otvoreni webinar "Osnove MongoDB"

Ako treba da dobijete informacije o najnovijoj grešci, koristite sljedeću naredbu:

db.getLastError()

To se može učiniti nakon svakog umetanja, ili možete konfigurirati Write Concern. Bolje je pročitati o tome u službena dokumentacija, koji je, inače, vrlo informativan u Mongi. Inače, dostupan je i na Habré-u dobar članak o ovome.

Pređimo na složenije upite

Upit za tačnu vrijednost polja:

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

Pisanjem takvog zahtjeva, dobićemo listu svih muških jednoroga u izlazu konzole.

Možete i vi upit na nekoliko polja odjednom: po spolu i po težini:

Otvoreni webinar "Osnove MongoDB"

Iznad, obratite pažnju na posebnost $gt selektor, što vam omogućava da uzgajate sve muške jednoroge težine više od 700.

Možete provjeriti da li polje uopšte postoji?:

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

Ili tako:

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

Sljedeći tim će iznijeti jednoroge, čija imena počinju slovima A ili a:

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

Sada razmislite pretraživanje niza. Pitanje #1: Šta će ova naredba proizvesti:

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

Tako je: svi koji vole jabuke.

Sljedeća naredba će vratiti samo one unicorn podatke koji sadrže samo jabuke i lubenice:

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

I još jedna komanda:

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

U našem slučaju, neće vratiti ništa, jer kada prođemo niz, prvi element se poredi sa prvim, drugi sa drugim itd. To jest, niz se takođe mora podudarati po poziciji ove vrednosti.

A ovako to izgleda pretražujući niz koristeći "OR" operator:

Otvoreni webinar "Osnove MongoDB"

Sljedeći primjer će nam pokazati pretražite koristeći $all operator. I ovdje je redoslijed nebitan:

Otvoreni webinar "Osnove MongoDB"

Takođe možemo traži po veličini niza:

Otvoreni webinar "Osnove MongoDB"

Ali šta ako želimo pronaći niz čija je veličina veća od jedan? Za ovo postoji operater $gdje, sa kojim možete napisati složenije stvari:

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

Inače, ako želiš da vežbaš, tu si fajl sa komandama.

Funkcije kursora

Hajdemo malo da odstupimo i kažemo nekoliko riječi o karakteristikama Monge:

  • find() i druge operacije ne vraćaju podatke - one vraćaju takozvani “kursor”;
  • činjenica da vidimo da se podaci štampaju je delo tumača.

Tipkanje db.unicorns.find bez zagrada, dobijamo prompt:

Otvoreni webinar "Osnove MongoDB"

Nastavljamo sa ispunjavanjem zahtjeva

Tu je i operator $in:

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

Otvoreni webinar "Osnove MongoDB"

A sada razgovarajmo o ažuriranju. Na primjer, promijenimo težinu jednoroga Rooooodles:

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

Kao rezultat naših akcija, dokument bit će potpuno ažurirana, a u njemu će ostati samo jedno navedeno polje:

Otvoreni webinar "Osnove MongoDB"

Odnosno, jedino što će ostati našem objektu je težina 2222 i, naravno, id.

Situaciju možete ispraviti koristeći $set:

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

Otvoreni webinar "Osnove MongoDB"

Postoji i mogućnost vrijednosti prirasta:

Otvoreni webinar "Osnove MongoDB"

I postoji također upsert - kombinacija ažuriranja i umetanja:

Otvoreni webinar "Osnove MongoDB"

Evo kako se to radi izbor polja:

Otvoreni webinar "Osnove MongoDB"

Otvoreni webinar "Osnove MongoDB"

Ostaje dodati nekoliko riječi o Skip и granica:

Otvoreni webinar "Osnove MongoDB"

Kolege, to je sve, ako želite da znate detalje, pogledajte cijeli video. I ne zaboravite ostaviti svoje komentare!

izvor: www.habr.com

Dodajte komentar