Programiranje

Pregled: MongoDB prevzema svet

Če ste v zadnjih nekaj letih izdelali srednje veliko do veliko spletno aplikacijo, ste verjetno razmišljali, da bi jo osnovali na odprtokodnem svežnju LAMP ali MEAN. Starejši sklad LAMP uporablja operacijski sistem Linux, spletni strežnik Apache, relacijsko bazo podatkov MySQL in programski jezik PHP. MEAN uporablja bazo podatkov MongoDB NoSQL, zaledno ogrodje spletne aplikacije Express, aplikacijsko platformo Angular in izvajalno okolje JavaScript Node.js. MEAN je v bistvu komplet JavaScript JavaScript od konca do konca. Linux v kratici ni izrecno omenjen, je pa običajno OS pod vozliščem.

V tem pregledu bom razpravljal o zbirki podatkov MongoDB, ki je zdaj v različici 4. MongoDB je zelo razširljiva, operativna baza podatkov, ki je na voljo tako v odprtokodni kot v komercialni različici podjetja in jo je mogoče zagnati lokalno ali kot upravljana storitev v oblaku. Upravljana storitev v oblaku se imenuje MongoDB Atlas.

MongoDB je daleč najbolj priljubljena baza podatkov NoSQL. Njegov model podatkovnih dokumentov daje razvijalcem veliko prilagodljivosti, njegova porazdeljena arhitektura pa omogoča veliko razširljivost. Zaradi tega je MongoDB pogosto izbran za aplikacije, ki morajo upravljati velike količine podatkov, ki jim je všeč horizontalna razširljivost in ki obdelujejo podatkovne strukture, ki ne ustrezajo relacijskemu modelu.

Ker je MongoDB primeren za najrazličnejše primere uporabe, je pogosto predstavljen kot nadomestek za relacijske baze podatkov. Čeprav je osvoboditev pred omejitvami toge sheme pogosto koristna, je treba upoštevati, da nobena zbirka dokumentov ni univerzalna rešitev - niti MongoDB ne.

Izvor MongoDB

Podjetje MongoDB je leta 2007 kot 10gen ustanovila ekipa, ki je stala za DoubleClickom, podjetjem za internetno oglaševanje. Prvotna motivacija za zbirko podatkov MongoDB je bila, da je sposoben obvladovati gibčnost in obseg, potreben za internetno oglaševanje. Kot primer obsega je DoubleClick leta 2007 prikazoval 400.000 oglasov na sekundo in se trudil, da bi se izkazal z obstoječimi podatkovnimi bazami tistega časa.

MongoDB je shramba, ki temelji na dokumentih in ima na njej nameščeno tudi shrambo na osnovi grafov. Druge vrste baz podatkov NoSQL so shrambe ključ-vrednost in shrambe na osnovi stolpcev. Vse vrste baz podatkov NoSQL imajo možnost razširitve na načine, ki v relacijskih zbirkah podatkov SQL iz leta 2007 niso bili mogoči, vendar imajo različne sorte baz podatkov NoSQL različne prednosti, slabosti in primere uporabe.

Nekateri glavni konkurenti NoSQL MongoDB kot operativnim podatkovnim bazam so Amazon DynamoDB (shramba ključev), Google Cloud BigTable (shramba stolpcev), Google Cloud Datastore (shramba dokumentov), ​​Redis (v pomnilniku, shramba ključev), Couchbase (multi-model ključ-vrednost in shramba dokumentov), ​​DataStax / Cassandra (shramba stolpcev) in Azure Cosmos DB (večmodel z možnostjo SQL in več shramb NoSQL).

Kaj je MongoDB?

MongoDB Inc. opisuje MongoDB kot "zbirko dokumentov z razširljivostjo in prilagodljivostjo, ki jo želite pri poizvedbah in indeksiranju, ki jih potrebujete." Da bi to lahko razčlenili, moramo najprej razumeti naravo zbirke dokumentov, ki je ena od vrst načrtov NoSQL.

Namesto da shranjuje močno tipizirane podatke v sorodnih normaliziranih tabelah s fiksnimi shemami, kot je relacijska baza podatkov, zbirka dokumentov shranjuje povezane podatke v denormalizirani obliki, vdelani v dokumente z imensko vrednostjo, podobne JSON-u. MongoDB dejansko ne shrani JSON-a: MongoDB shrani BSON (Binarni JSON), ki razširja predstavitev JSON (nize), da vključuje dodatne vrste, kot so int, dolga, datum, s plavajočo vejico, decimalno 128in geoprostorske koordinate, kot je prikazano na spodnjem diagramu. Dokumenti BSON vsebujejo eno ali več polj in vsako polje vsebuje vrednost določenega podatkovnega tipa, vključno z nizi, binarnimi podatki in poddokumenti. BSON tudi sledi velikosti vsakega dokumenta, da omogoči učinkovito iskanje.

MongoDB

Tipkanje BSON se podaja v indeksiranje polj. MongoDB lahko na eni kopiji podatkov ustvari večmodalni indeks grafov, geoprostorskih indeksov, B-dreves in celotnega besedila s pomočjo vrste podatkov, da ustvari pravi tip indeksa. MongoDB vam omogoča ustvarjanje indeksov v poljubnem polju dokumenta.

MongoDB

MongoDB ima zbirke podatkov, zbirke (tabele), dokumente (vrstice), polja (stolpce), indekse, $ lookup ali vdelani dokumenti (združevanja), primarni ključi, zbirni plinovod in transakcije. Za boljšo zmogljivost in da se izognete potrebi po transakcijah z več dokumenti, boste verjetno želeli v MongoDB uporabljati poddokumente in polja, namesto da podatke shranjujete v normalizirani obliki, kot bi to storili v zbirki podatkov SQL.

MongoDB 4 naredi imeti transakcije z več dokumenti, kar pomeni, da lahko še vedno dobite lastnosti ACID, tudi če morate normalizirati zasnovo podatkov. Prejšnje različice niso.

Kar mi je vredno, so mi predstavniki MongoDB rekli, da transakcije z enim dokumentom obravnavajo 90 odstotkov primerov uporabe, ki potrebujejo lastnosti ACID. Ko so stranke potrebovale ACID za transakcije z več dokumenti pred različico 4, so jo v osnovi same implementirale na ravni aplikacije.

MongoDB privzeto uporablja dinamične sheme, včasih imenovane tudi brez shem. Dokumenti v eni zbirki so ne imeti mora enak nabor polj, vrsta podatkov za polje pa se lahko razlikuje med dokumenti znotraj zbirke. Strukture dokumentov lahko kadar koli spremenite.

Vendar je na voljo upravljanje sheme. Od MongoDB 3.6 dalje MongoDB podpira preverjanje veljavnosti sheme JSON. Če ga želite vklopiti, uporabite $ jsonSchema v izrazu za preverjanje veljavnosti. Preverjanje velja med posodobitvami in vstavki.

Kot lahko vidite na posnetku dokumentacije in posnetku zaslona MongoDB Atlas spodaj, ima MongoDB lasten jezik poizvedb, implementiran v lupini Mongo, v 12 podprtih API-jih za gonilnike jezika (in še veliko več iz skupnosti) ter v GUI Compass in Zavihek Atlas Collections (Raziskovalec podatkov). Poizvedbeni jezik MongoDB sploh ni enak SQL, vendar obstaja bolj ali manj neposredno preslikavo med njima. Pravim "bolj ali manj", ker relacijske zbirke podatkov ne podpirajo vdelanih dokumentov, MongoDB pa jih podpira. To ni nujno vse dobro, kot boste videli v naslednjem razdelku.

MongoDB MongoDB

MongoDB agregacijski okvir uporablja operaterje cevovodov, ki so bolj ali manj enakovredni SQL-u SKUPINA PO in KJE klavzule. Na primer, naslednja poizvedba uporablja zbirko podatkov skupine uporabnikov MongoDB, da v lupini Mongo navede pretekle dogodke in skupno število odgovorov za vsak dogodek:

> db.past_events.aggregate ([{'$ match': {'batchID': 101, 'event.status': 'past', 'event.group.urlname': {'$ in': ['Atlanta-MongoDB -User-Group ',' Austin-MongoDB-User-Group ',' Baltimore-MongoDB-Users-Group ',' Bangalore-MongoDB-User-Group ',' Belfast-MongoDB-User-Group ',' Bergen-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}}])

Poizvedba uporablja agregat funkcijo z $ match, $ v, $ group, $ vsota, in $ projekt in vrne naslednje:

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

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

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

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

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

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

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

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

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

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

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

{"count_count": 11, "rsvp_count": 321, "group": "Baltimore-MongoDB-Users-Group", "leto": 2013}

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

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

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

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

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

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

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

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

Vnesite "it" za več

MongoDB ima tudi mapReduce funkcijo. Grafični vmesnik Compass ima izdelovalca agregacijskega cevovoda, ki omogoča poenostavljeno ustvarjanje poizvedb, kot je zgoraj.

MongoDB podpira vrsto ravni skladnosti podatkov strežnika, začenši z branje nezavzeto in grem vzročna. Vzročna skladnost je bila dodana samo v različici 3.6 in je podprta tudi v odjemalskih sejah. Naročnik nastavi branje in pisanje skrbi da določite želeno stopnjo skladnosti.

V MongoDB je operacija pisanja atomska na ravni posameznega dokumenta, tudi če operacija spremeni več vdelanih dokumentov v enem dokumentu. Ko ena operacija pisanja (npr. db.collection.updateMany ()) spremeni več dokumentov, sprememba vsakega dokumenta je atomska, vendar operacija kot celota ni atomska. Od različice 4.0 za situacije, ki zahtevajo atomskost za posodobitve več dokumentov ali doslednost med branjem več dokumentov, MongoDB ponuja transakcije z več dokumenti za nabore replik, kar stane stroške delovanja.

$config[zx-auto] not found$config[zx-overlay] not found