Programavimas

Apžvalga: „MongoDB“ užima pasaulį

Jei per pastaruosius kelerius metus sukūrėte vidutinio dydžio ir didelio masto žiniatinklio programą, tikriausiai apsvarstėte galimybę remtis atvirojo šaltinio LAMP arba MEAN kaminu. Senesniame LAMP šūsnyje naudojama „Linux“ operacinė sistema, „Apache“ žiniatinklio serveris, „MySQL“ reliacinė duomenų bazė ir PHP programavimo kalba. MEAN naudoja „MongoDB NoSQL“ duomenų bazę, „Express“ vidinės programos aplikacijų sistemą, „Angular“ programų platformą ir „Node.js“ „JavaScript“ vykdymo laiką. MEAN iš esmės yra „end-to-end“ „JavaScript“ šūsnis. „Linux“ nėra aiškiai paminėta akronime, tačiau paprastai tai yra OS, esanti po mazgu.

Šioje apžvalgoje aptarsiu „MongoDB“ duomenų bazę, kurios versija dabar yra 4. Valdoma debesų paslauga vadinama „MongoDB Atlas“.

„MongoDB“ yra pati populiariausia iš „NoSQL“ duomenų bazių. Jo dokumentų duomenų modelis suteikia kūrėjams didelį lankstumą, o jo paskirstyta architektūra leidžia labai keisti. Todėl „MongoDB“ dažnai pasirenkamas programoms, kurios turi valdyti didelius duomenų kiekius, kurios naudojasi horizontaliu masteliu ir tvarko duomenų struktūras, kurios neatitinka reliacinio modelio.

Kadangi „MongoDB“ tinka įvairiems naudojimo atvejams, jis dažnai pateikiamas kaip reliacinių duomenų bazių pakaitalas. Tačiau, nors laisvė nuo griežtų schemos apribojimų dažnai yra naudinga, svarbu nepamiršti, kad jokia dokumentų duomenų bazė nėra universalus sprendimas - net „MongoDB“.

MongoDB kilmė

„MongoDB“ kompaniją 2007 m. Kaip „10gen“ įkūrė interneto reklamos bendrovės „DoubleClick“ komanda. Pirminė „MongoDB“ duomenų bazės motyvacija buvo sugebėti valdyti judrumą ir mastą, reikalingą reklamai internete. Kaip pavyzdį, 2007 m. „DoubleClick“ teikė 400 000 skelbimų per sekundę ir stengėsi pasirodyti su esamomis to meto duomenų bazėmis.

„MongoDB“ yra dokumentais pagrįsta parduotuvė, kurioje taip pat įdiegta grafikais pagrįsta parduotuvė. Kitos „NoSQL“ duomenų bazių rūšys yra pagrindinės vertės saugyklos ir stulpelinės parduotuvės. Visų rūšių NoSQL duomenų bazės turi galimybę išplėsti būdus, kurių neįmanoma padaryti 2007 m. SQL reliacinėse duomenų bazėse, tačiau skirtingos „NoSQL“ duomenų bazių atmainos turi skirtingas stiprybes, silpnybes ir naudojimo atvejus.

Kai kurie pagrindiniai „NoSQL“ konkurentai, veikiantys kaip „MongoDB“ kaip operatyvinės duomenų bazės, yra „Amazon DynamoDB“ (raktų vertės saugykla), „Google Cloud BigTable“ (stulpelių parduotuvė), „Google Cloud Datastore“ (dokumentų saugykla), „Redis“ (atmintyje, raktų vertės saugykla), „Couchbase“ (kelių modelių raktų reikšmių ir dokumentų saugykla), „DataStax / Cassandra“ (stulpelių saugykla) ir „Azure Cosmos DB“ (kelių modelių, įskaitant SQL parinktį, taip pat kelias „NoSQL“ parduotuves).

Kas yra „MongoDB“?

„MongoDB Inc.“ apibūdina „MongoDB“ kaip „dokumentų duomenų bazę, kurios mastelis ir lankstumas reikalingi atliekant jums reikalingas užklausas ir indeksavimą“. Norėdami tai išanalizuoti, pirmiausia turime suprasti dokumentų duomenų bazės, kuri yra viena iš „NoSQL“ dizaino rūšių, pobūdį.

Užuot saugojus griežtai surinktus duomenis susijusiose normalizuotose lentelėse su fiksuotomis schemomis, pvz., Reliacine duomenų baze, dokumentų duomenų bazėje susiję duomenys saugomi nenormalizuota forma, įterptais į JSON panašius vardo vertės dokumentus. „MongoDB“ iš tikrųjų JSON nesaugo: „MongoDB“ saugo BSON (dvejetainį JSON), kuris išplečia JSON atvaizdavimą (eilutes), įtraukdamas papildomų tipų, tokių kaip tarpt, ilgas, data, plūduriuojantis taškas, dešimtainis skaičius128ir geoerdvinės koordinatės, kaip parodyta toliau pateiktoje diagramoje. BSON dokumentuose yra vienas ar daugiau laukų, o kiekviename lauke yra konkretaus duomenų tipo vertė, įskaitant masyvus, dvejetainius duomenis ir subdokumentus. BSON taip pat seka kiekvieno dokumento dydį, kad būtų galima efektyviai ieškoti.

MongoDB

BSON spausdinimas įtraukia į laukų indeksavimą. „MongoDB“ gali generuoti daugiamodalius grafinius, geoerdvinius, B medžių ir viso teksto indeksus vienoje duomenų kopijoje, naudodamas duomenų tipą, kad sugeneruotų teisingą indekso tipą. „MongoDB“ leidžia kurti indeksus bet kuriame dokumento lauke.

MongoDB

„MongoDB“ turi duomenų bazes, rinkinius (lenteles), dokumentus (eilutes), laukus (stulpelius), rodykles, $ peržiūra arba įterptus dokumentus (sujungimus), pagrindinius raktus, kaupimo procesą ir operacijas. Siekdami geresnio našumo ir išvengdami daugialypių dokumentų operacijų, tikriausiai norėsite naudoti subdokumentus ir masyvus „MongoDB“, o ne laikyti duomenis normalizuota forma, kaip tai darytumėte SQL duomenų bazėje.

„MongoDB 4“ daro turėti kelių dokumentų operacijas, o tai reiškia, kad vis tiek galite gauti ACID savybes, net jei turite normalizuoti savo duomenų dizainą. Ankstesnės versijos to nepadarė.

Dėl ko verta, „MongoDB“ atstovai man pasakė, kad vieno dokumento operacijos apdoroja 90 procentų naudojimo atvejų, kuriems reikalingos rūgštinės savybės. Kai klientams reikėjo ACID kelių dokumentų operacijoms iki 4 versijos, jie iš esmės patys ją įgyvendino programos lygiu.

Pagal numatytuosius nustatymus „MongoDB“ naudoja dinamines schemas, kartais vadinamas schemomis. Vieno rinkinio dokumentai yra ne turi būti tas pats laukų rinkinys, o lauko duomenų tipas gali skirtis įvairiuose kolekcijos dokumentuose. Galite bet kada pakeisti dokumentų struktūrą.

Tačiau yra schemos valdymas. Pradedant nuo „MongoDB 3.6“, „MongoDB“ palaiko JSON schemos patvirtinimą. Norėdami jį įjungti, naudokite $ jsonSchema operatorius jūsų tikrintuvo išraiškoje. Patvirtinimas įvyksta atnaujinant ir įterpiant.

Kaip matote toliau pateiktoje dokumentacijos momentinėje nuotraukoje ir „MongoDB Atlas“ ekrano kopijoje, „MongoDB“ turi savo užklausos kalbą, įdiegtą „Mongo“ apvalkale, 12 palaikomų kalbos tvarkyklių API (ir daug daugiau iš bendruomenės) ir „Compass“ GUI bei „Atlas“ kolekcijų skirtukas („Data Explorer“). „MongoDB“ užklausos kalba visiškai nesiskiria nuo „SQL“, tačiau tarp jų yra daugiau ar mažiau tiesioginis susiejimas. Sakau „daugiau ar mažiau“, nes reliacinės duomenų bazės nepalaiko įterptųjų dokumentų, tačiau „MongoDB“ palaiko. Tai nebūtinai visi gerai, kaip pamatysite kitame skyriuje.

MongoDB MongoDB

„MongoDB“ agregavimo sistemoje naudojami vamzdynų operatoriai, kurie daugmaž prilygsta SQL GRUPUOTI PAGAL ir KUR sąlygos. Pavyzdžiui, ši užklausa naudoja „MongoDB“ vartotojų grupių duomenų bazę, kad „Mongo“ apvalkale būtų išvardyti praeities įvykiai ir bendras kiekvieno įvykio atsakymas:

> db.past_events.aggregate ([{'$ match': {'batchID': 101, 'event.status': 'past', 'event.group.urlname': {'$ in': ['Atlanta-MongoDB -Vartotojo grupė “,„ Austin-MongoDB-vartotojų grupė “,„ Baltimore-MongoDB-vartotojų grupė “,„ Bangalore-MongoDB-vartotojų grupė “,„ Belfastas-MongoDB-vartotojų grupė “,„ Bergenas-NoSQL "," Bordeaux-MongoDB-User-Group "," Boston-MongoDB-User-Group "]}}},

{'$ group': {'_id': {'urlname': '$ event.group.urlname', 'year': {'$ year': '$ event.time'}}, 'event_count': {' $ sum ': 1},' rsvp_count ': {' $ sum ':' $ event.yes_rsvp_count '}}},

{'$ project': {'_id': 0, 'group': '$ _id.urlname', 'year': '$ _id.year', 'event_count': 1, 'rsvp_count': 1}}])

Užklausoje naudojamas suvestinė funkcija su $ rungtynės, $ į, $ grupė, $ sumair $ projektas operatoriai ir grąžina:

{"event_count": 2, "rsvp_count": 27, "group": "Boston-MongoDB-User-Group", "metai": 2017}

{"event_count": 5, "rsvp_count": 94, "group": "Boston-MongoDB-User-Group", "metai": 2016}

{"event_count": 5, "rsvp_count": 231, "group": "Boston-MongoDB-User-Group", "metai": 2015}

{"event_count": 3, "rsvp_count": 175, "group": "Boston-MongoDB-User-Group", "metai": 2014}

{"event_count": 10, "rsvp_count": 489, "group": "Boston-MongoDB-User-Group", "metai": 2013}

{"event_count": 12, "rsvp_count": 444, "group": "Boston-MongoDB-User-Group", "metai": 2012}

{"event_count": 2, "rsvp_count": 118, "group": "Boston-MongoDB-User-Group", "metai": 2011}

{"event_count": 6, "rsvp_count": 84, "group": "Atlanta-MongoDB-User-Group", "metai": 2011}

{"event_count": 3, "rsvp_count": 74, "group": "Baltimore-MongoDB-Users-Group", "metai": 2012}

{"event_count": 1, "rsvp_count": 5, "group": "Bergen-NoSQL", "metai": 2015}

{"event_count": 15, "rsvp_count": 286, "group": "Atlanta-MongoDB-User-Group", "metai": 2012}

{"event_count": 11, "rsvp_count": 321, "group": "Baltimore-MongoDB-Users-Group", "metai": 2013}

{"event_count": 8, "rsvp_count": 124, "group": "Bangalore-MongoDB-User-Group", "metai": 2015}

{"event_count": 6, "rsvp_count": 381, "group": "Bangalore-MongoDB-User-Group", "metai": 2013}

{"event_count": 7, "rsvp_count": 242, "group": "Bangalore-MongoDB-User-Group", "metai": 2012}

{"event_count": 13, "rsvp_count": 233, "group": "Atlanta-MongoDB-User-Group", "metai": 2013}

{"event_count": 10, "rsvp_count": 171, "group": "Baltimore-MongoDB-Users-Group", "metai": 2014}

{"event_count": 3, "rsvp_count": 28, "group": "Austin-MongoDB-User-Group", "metai": 2017}

{"event_count": 2, "rsvp_count": 52, "group": "Austin-MongoDB-User-Group", "metai": 2016}

{"event_count": 1, "rsvp_count": 8, "group": "Atlanta-MongoDB-User-Group", "metai": 2018}

Įveskite „it“, kad gautumėte daugiau

„MongoDB“ taip pat turi a mapSumažinti funkcija. „Compass“ GUI turi agregavimo vamzdynų kūrimo priemonę, kuri sukuria tokias užklausas kaip aukščiau, gana paprasta.

„MongoDB“ palaiko įvairius serverio duomenų nuoseklumo lygius, pradedant nuo skaityti neįsipareigojus ir einu į priežastinis. Priežastinis nuoseklumas buvo pridėtas tik 3.6 versijoje, taip pat palaikomas kliento sesijose. Klientas nustato skaitymą ir rašymą susirūpinimą norimam nuoseklumo lygiui nurodyti.

„MongoDB“ rašymo operacija yra atominė vieno dokumento lygmeniu, net jei operacija modifikuoja kelis įdėtus dokumentus viename dokumente. Kai atliekama viena rašymo operacija (pvz., db.collection.updateMany ()) modifikuoja kelis dokumentus, kiekvieno dokumento modifikacija yra atominė, tačiau visa operacija nėra atominė. Pradedant nuo 4.0 versijos, „MongoDB“, reikalaujanti daugybės dokumentų atnaujinimo ar nuoseklumo tarp skaitymų į kelis dokumentus, reikalauja daugybės dokumentų, „MongoDB“ pateikia daugelio dokumentų operacijas replikų rinkiniams, už našumą.