Amikoj, alia kurso lanĉo
La retseminario okazis
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:
Nun ni skribu la tradician Saluton mondo:
print (“Hello world!”)
Post tio - ni komencu la ciklon:
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
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
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:
Do, ni revenu al nia komando, rezulte de kiu la konzolo raportos, ke unu linio estis enmetita:
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:
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):
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:
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:
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});
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()
:
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
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:
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:
La sekva ekzemplo montros al ni serĉu per $all operatoro. Kaj ĉi tie la sinsekvo estas negrava:
Ankaŭ ni povas serĉu laŭ grandeco de tabelo:
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,
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:
Ni daŭre plenumas petojn
Ekzistas ankaŭ la $in-funkciigisto:
db.unicorns.find({weight: {$in: [650, 704]}})
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:
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}})
Ankaŭ eblas pliigaj valoroj:
Kaj ekzistas ankaŭ ĉagreniĝi - kombinaĵo de ĝisdatigo kaj enmeto:
Jen kiel ĝi estas farita elekto de kampo:
Restas aldoni kelkajn vortojn pri salti и limo:
Kolegoj, jen ĉio, se vi volas scii la detalojn,
fonto: www.habr.com