Malfermu retseminarion "MongoDB Basics"

Amikoj, alia kurso lanĉo "Datumbazo" okazos morgaŭ, do ni okazigis tradician malfermitan lecionon, kies registradon vi povas spekti tie. Ĉi-foje ni parolis pri la populara MongoDB-datumbazo: ni studis kelkajn el la subtilecoj, rigardis la bazaĵojn de funkciado, kapabloj kaj arkitekturo. Ni ankaŭ tuŝis kelkajn Uzantajn Kazojn.

Malfermu retseminarion "MongoDB Basics"

La retseminario okazis Ivano Zono, estro de servila evoluo ĉe Citymobil.

Karakterizaĵoj de MongoDB

MongoDB estas malfermfonta dokument-orientita DBMS kiu ne postulas priskribon de la tabelskemo. Ĝi estas klasifikita kiel NoSQL kaj uzas BSON (binara JSON). Skalebla el la skatolo, skribita en C++ kaj subtenas JavaScript-sintakso. Ne ekzistas SQL-subteno.

MongoDB havas ŝoforojn por multaj popularaj programlingvoj (C, C++, C#, Go, Java, JavaScript, Perl, PHP, Python, Ruby, ktp.). Ekzistas ankaŭ neoficialaj kaj komunum-subtenataj ŝoforoj por aliaj programlingvoj.

Nu, ni rigardu la bazajn komandojn, kiuj povas esti utilaj.

Do, por deploji MongoDB en Docker, ni skribas:

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

Tiel okazas kliento lanĉo MongoDB:

Malfermu retseminarion "MongoDB Basics"

Nun ni skribu la tradician Saluton mondo:

print (“Hello world!”)

Malfermu retseminarion "MongoDB Basics"

Post tio - ni komencu la ciklon:

Malfermu retseminarion "MongoDB Basics"

Kiel vi rimarkis, antaŭ ni regula JS, kaj MongoDB estas plentaŭga JavaScript-interpretisto.

Kiam uzi MongoDB?

Estas rakonto, ke la averaĝa starto en Silicon Valley estas la persono, kiu malfermis la libron "HTML for Dummies" antaŭ semajno. Kiun stakon li elektos? Konsentu, ke ĝi estas tre oportuna por li kiam, pro evidentaj kialoj, li havas JavaScript en sia retumilo, Node.js funkcias en la servilo, kaj JavaScript ankaŭ funkcias en la datumbazo. Ĉi tio estas punkto numero 1.

Due, ekzistas bonega agado Peter Zaitsev, unu el la plej bonaj datumbazaj specialistoj en Rusio. En ĝi, Petro parolas pri MySQL kaj MongoDB, atentante kiam kaj kio estas plej bone uzi.

Trie, mi ŝatus emfazi, ke MongoDB karakterizas per bono skaleblo - kaj ĉi tio estas unu el la ĉefaj trajtoj de la datumbazo. Se vi ne scias anticipe, kia estos la ŝarĝo, MongoDB estas perfekta. Krome, ĝi subtenas eksterordinarajn ŝablonojn kiel ekzemple sharding и reproduktado, kaj ĉio ĉi estas farita sufiĉe travidebla, tio estas, estas tre oportune labori.

Koncerne al terminologio en MongoDB tiam:

  • datumbazoj estas datumbazoj (skemoj, kolektoj de tabeloj);
  • en MongoDB ekzistas tia afero kiel la kolekto - ĉi tio estas analogo de tabelo kaj aro da dokumentoj, kiuj, logike, estu kunligitaj;
  • dokumentoj estas analogaj al ĉeno.

Kreado de datumbazoj kaj simplaj demandoj

Por krei datumbazon, vi nur bezonas komenci uzi ĝin:

use learn

Malfermu retseminarion "MongoDB Basics"

Nun ni faru malgrandan enmeton de la dokumento. Estu, ekzemple, unikorno nomita Aŭrora:

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

db - tutmonda objekto por aliri la datumbazon, tio estas, fakte, la "monga" mem. Uzita por sharding sh, por reproduktado - rs.

Kiajn ordonojn la objekto havas? db:

Malfermu retseminarion "MongoDB Basics"

Do, ni revenu al nia komando, rezulte de kiu la konzolo raportos, ke unu linio estis enmetita:

Malfermu retseminarion "MongoDB Basics"

vorto unicorns en teamo db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) indikas kolekton. Bonvolu noti ĉi tie, ke ni ne priskribis aŭ kreis la kolekton, sed simple skribis 'unikornoj', faris enmeton, kaj ni havis kolekton.

Kaj jen kiel ni povas akiri ĉiujn niajn kolektojn:

db.getCollectionNames()

Kaj tiel plu. Povas enigu alian kolekto:

Malfermu retseminarion "MongoDB Basics"

Nun ni demandu kompleta kolekto (ni memorigas al vi, ke en nia kazo la datumbazo jam enhavas informojn pri du samnomaj unikornoj):

db.unicorns.find()

Bonvolu noti, jen nia JSON (estas nomo, sekso, pezo, iu unika objektidentigilo):

Malfermu retseminarion "MongoDB Basics"

Nun ni enigu kelkajn pliajn unikornojn kun la samaj nomoj:

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

Kaj ni vidu kio okazis:

Malfermu retseminarion "MongoDB Basics"

Kiel vi povas vidi, ni havas pliajn kampojn: hejmo и vermo, kiun Aŭrora ne havas.

Ni aldonu kelkajn pliajn unikornojn:

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

Do, ni enigis kvar pliajn objektojn uzante JavaScript:

Malfermu retseminarion "MongoDB Basics"

Laŭ vi, en kiuj datumbazoj estas pli oportune konservi pasportajn datumojn: interrilataj datumbazoj aŭ Mongo?

La respondo estas evidenta - en Monga, kaj la supra ekzemplo montras tion bone. Ne estas sekreto, ke KLADR estas doloro en Rusa Federacio. Kaj Monga tre bone kongruas kun adresoj, ĉar vi povas agordi ĉion kiel tabelon, kaj la vivo estos multe pli facila. Kaj ĝi estas bona Uzantkazo por MongoDB.

Ni aldonu pli da unikornoj:

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

Malfermu retseminarion "MongoDB Basics"

Nun atentu la dokumentojn. Kiel tamburo Ni stokas tutajn objektojn. Estas ankaŭ informoj pri tio, kion unikornulo amas, kaj ne ĉiuj havas ĉi tiun informon. Do interne mensogoj plena tabelo.

Cetere, por montri la rezultojn pli bele, vi povas voki la metodon ĉe la fino de la serĉa komando .pretty():

Malfermu retseminarion "MongoDB Basics"

Se vi bezonas akiri informojn pri la plej nova eraro, uzu la jenan komandon:

db.getLastError()

Ĉi tio povas esti farita post ĉiu enmeto, aŭ vi povas agordi Write Concern. Pli bone legi pri ĝi en oficiala dokumentaro, kiu, cetere, estas tre informa en Monga. Cetere, ĝi ankaŭ haveblas ĉe Habré bona artikolo pri tio.

Ni transiru al pli kompleksaj demandoj

Demando pri preciza kampvaloro:

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

Skribante tian peton, ni ricevos liston de ĉiuj viraj unikornoj en la konzola eligo.

Vi ankaŭ povas fari demandu sur pluraj kampoj samtempe: laŭ sekso kaj laŭ pezo:

Malfermu retseminarion "MongoDB Basics"

Supre, atentu la specialaĵon $gt elektilo, kiu ebligas al vi bredi ĉiujn virajn unikornojn pezantajn pli ol 700.

Vi povas kontroli ĉu la kampo entute ekzistas?:

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

Aŭ tiel:

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

La sekva teamo elportos la unikornojn, kies nomoj komenciĝas per la literoj A aŭ a:

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

Nun ni konsideru tabelserĉo. Demando numero 1: Kion eligos ĉi tiu komando:

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

Ĝuste: ĉiuj, kiuj amas pomojn.

La sekva komando resendos nur tiujn unikornajn datumojn enhavantajn nur pomoj kaj akvomelonoj:

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

Kaj unu plia ordono:

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

En nia kazo, ĝi revenos nenion, ĉar kiam ni pasas tabelon, la unua elemento estas komparata kun la unua, la dua kun la dua, ktp. Tio estas, la tabelo ankaŭ devas kongrui. per pozicio ĉi tiuj valoroj.

Kaj jen kiel ĝi aspektas serĉante tra tabelo uzante la "OR" funkciigiston:

Malfermu retseminarion "MongoDB Basics"

La sekva ekzemplo montros al ni serĉu per $all operatoro. Kaj ĉi tie la sinsekvo estas negrava:

Malfermu retseminarion "MongoDB Basics"

Ankaŭ ni povas serĉu laŭ grandeco de tabelo:

Malfermu retseminarion "MongoDB Basics"

Sed kio se ni volas trovi tabelon, kies grandeco estas pli granda ol unu? Estas operatoro por ĉi tio $kie, per kiu vi povas skribi pli kompleksajn aferojn:

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

Cetere, se vi volas praktiki, Jen vi dosiero kun komandoj.

Kursoro Trajtoj

Ni iom malproksimiĝu kaj diru kelkajn vortojn pri la trajtoj de Monga:

  • find() kaj aliaj operacioj ne redonas datumojn - ili resendas tiel nomatan “kursoro”;
  • la fakto ke ni vidas la datumojn esti presitaj estas la laboro de la interpretisto.

Tajpado db.unicorns.find sen krampoj, ni ricevas la prompton:

Malfermu retseminarion "MongoDB Basics"

Ni daŭre plenumas petojn

Ekzistas ankaŭ la $in-funkciigisto:

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

Malfermu retseminarion "MongoDB Basics"

Nun ni parolu pri ĝisdatigo. Ekzemple, ni ŝanĝu la pezon de la unikorno Rooooodles:

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

Kiel rezulto de niaj agoj, la dokumento estos tute ĝisdatigita, kaj nur unu specifita kampo restos en ĝi:

Malfermu retseminarion "MongoDB Basics"

Tio estas, la nura afero, kiu restos por nia objekto, estas la pezo 2222 kaj, kompreneble, id.

Vi povas korekti la situacion uzante $aro:

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

Malfermu retseminarion "MongoDB Basics"

Ankaŭ eblas pliigaj valoroj:

Malfermu retseminarion "MongoDB Basics"

Kaj ekzistas ankaŭ ĉagreniĝi - kombinaĵo de ĝisdatigo kaj enmeto:

Malfermu retseminarion "MongoDB Basics"

Jen kiel ĝi estas farita elekto de kampo:

Malfermu retseminarion "MongoDB Basics"

Malfermu retseminarion "MongoDB Basics"

Restas aldoni kelkajn vortojn pri salti и limo:

Malfermu retseminarion "MongoDB Basics"

Kolegoj, jen ĉio, se vi volas scii la detalojn, spektu la tutan videon. Kaj ne forgesu lasi viajn komentojn!

fonto: www.habr.com

Aldoni komenton