Programovanie

Recenzia: MongoDB má svet

Ak ste za posledných pár rokov vytvorili stredne veľkú až veľkú webovú aplikáciu, pravdepodobne ste zvážili jej založenie na otvorenom zdroji LAMP alebo MEAN. Starší balík LAMP používa operačný systém Linux, webový server Apache, relačnú databázu MySQL a programovací jazyk PHP. MEAN používa databázu MongoDB NoSQL, rámec back-endových webových aplikácií Express, aplikačnú platformu Angular a runtime JavaScript Node.js. MEAN je v podstate koncový zásobník JavaScriptu. Linux nie je v skratke výslovne uvedený, ale zvyčajne ide o OS pod Node.

V tejto recenzii sa budem zaoberať databázou MongoDB, ktorá je teraz vo verzii 4. MongoDB je vysoko škálovateľná operatívna databáza dostupná vo verziách open source aj v komerčných podnikoch. Môže byť spustená lokálne alebo ako spravovaná cloudová služba. Spravovaná cloudová služba sa volá MongoDB Atlas.

MongoDB je zďaleka najobľúbenejší z NoSQL databáz. Jeho dátový model dokumentov poskytuje vývojárom veľkú flexibilitu, zatiaľ čo jeho distribuovaná architektúra umožňuje veľkú škálovateľnosť. Výsledkom je, že MongoDB sa často vyberá pre aplikácie, ktoré musia spravovať veľké objemy dát, ktoré využívajú výhody horizontálnej škálovateľnosti a ktoré spracúvajú dátové štruktúry, ktoré sa nehodia k relačnému modelu.

Pretože MongoDB je vhodný pre najrôznejšie prípady použitia, často sa uvádza ako náhrada za relačné databázy. Aj keď je oslobodenie od obmedzení rigidnej schémy často prospešné, je treba mať na pamäti, že žiadna databáza dokumentov nie je univerzálnym riešením - ani MongoDB.

Pôvod MongoDB

Spoločnosť, ktorá stojí za MongoDB, bola založená v roku 2007 ako 10gen tímom, ktorý stál za spoločnosťou DoubleClick, internetovou reklamou. Pôvodnou motiváciou pre databázu MongoDB bola schopnosť zvládnuť agilitu a rozsah potrebný pre internetovú reklamu. Ako príklad rozsahu ponúkol DoubleClick v roku 2007 400 000 reklám za sekundu a snažil sa dosiahnuť výkon s existujúcimi databázami tej doby.

MongoDB je obchod založený na dokumentoch, ktorý má navyše implementovaný aj obchod založený na grafoch. Ďalšími druhmi databáz NoSQL sú obchody s kľúčmi a stĺpcami. Všetky druhy databáz NoSQL zdieľajú schopnosť škálovať spôsobmi, ktoré neboli možné v relačných databázach SQL z roku 2007, ale rôzne varianty databáz NoSQL majú rôzne silné a slabé stránky a prípady použitia.

Medzi hlavných konkurentov NoSQL pre MongoDB ako prevádzkové databázy patria Amazon DynamoDB (obchod s kľúčom a hodnotou), Google Cloud BigTable (obchod so stĺpcami), Google Cloud Datastore (obchod s dokumentmi), Redis (v pamäti, obchod s kľúčom a hodnotou), Couchbase (multi-model kľúč-hodnota a sklad dokumentov), ​​DataStax / Cassandra (store column) a Azure Cosmos DB (multi-model vrátane možnosti SQL, ako aj niekoľkých obchodov NoSQL).

Čo je MongoDB?

Spoločnosť MongoDB Inc. popisuje spoločnosť MongoDB ako „databázu dokumentov s požadovanou škálovateľnosťou a flexibilitou pri požadovanom dotazovaní a indexovaní.“ Aby sme to mohli analyzovať, najskôr musíme pochopiť podstatu databázy dokumentov, čo je jeden z druhov návrhov NoSQL.

Namiesto ukladania silne zadaných údajov do súvisiacich normalizovaných tabuliek s pevnými schémami, ako je napríklad relačná databáza, ukladá databáza dokumentov súvisiace údaje v de-normalizovanej podobe vložené do dokumentov typu JSON podobných mien. MongoDB však v skutočnosti neukladá JSON: MongoDB ukladá BSON (binárne JSON), čo rozširuje reprezentáciu JSON (reťazce) o ďalšie typy, ako napr. int, dlho, dátum, plávajúca desatina, desatinné číslo 128a geopriestorové súradnice, ako je znázornené na nasledujúcom diagrame. Dokumenty BSON obsahujú jedno alebo viac polí a každé pole obsahuje hodnotu konkrétneho dátového typu, vrátane polí, binárnych údajov a vnorených dokumentov. BSON tiež sleduje veľkosť každého dokumentu, aby bolo možné efektívne vyhľadávať.

MongoDB

Typizácia BSON sa prenáša do indexovania polí. MongoDB môže generovať multimodálne grafy, geopriestorové indexy, B-stromy a fulltextové indexy na jednej kópii údajov, pričom pomocou typu údajov vygeneruje správny typ indexu. MongoDB vám umožňuje vytvárať indexy v ľubovoľnom poli dokumentu.

MongoDB

MongoDB má databázy, zbierky (tabuľky), dokumenty (riadky), polia (stĺpce), indexy, $ vyhľadávanie alebo vložené dokumenty (spojenia), primárne kľúče, agregačný kanál a transakcie. Ak chcete dosiahnuť lepší výkon a vyhnúť sa nutnosti transakcií s viacerými dokumentmi, pravdepodobne budete chcieť v MongoDB použiť vnorené dokumenty a polia, a nie ukladať svoje údaje v normalizovanej podobe, ako by to bolo v databáze SQL.

MongoDB 4 robí mať transakcie s viacerými dokumentmi, čo znamená, že stále môžete získať vlastnosti KYSELINY, aj keď musíte normalizovať návrh svojich údajov. Predchádzajúce verzie nie.

Za to, čo to stojí, mi zástupcovia MongoDB povedali, že transakcie s jedným dokumentom zvládajú 90 percent prípadov použitia, ktoré vyžadujú vlastnosti ACID. Keď zákazníci potrebovali ACID pre transakcie s viacerými dokumentmi pred verziou 4, v zásade si ich implementovali sami na aplikačnej úrovni.

MongoDB štandardne používa dynamické schémy, ktoré sa niekedy nazývajú aj bez schémy. Dokumenty v jednej zbierke áno nie musíte mať rovnakú sadu polí a dátový typ pre pole sa môže líšiť medzi dokumentmi v zbierke. Štruktúry dokumentov môžete kedykoľvek zmeniť.

K dispozícii je však správa schém. Počnúc MongoDB 3.6 podporuje MongoDB overenie schémy JSON. Ak ju chcete zapnúť, použite $ jsonSchema operátor vo vašom výraze validátora. K overeniu dôjde počas aktualizácií a vkladaní.

Ako môžete vidieť na snímke dokumentácie a snímke obrazovky MongoDB Atlas nižšie, MongoDB má svoj vlastný dopytovací jazyk implementovaný v prostredí Mongo, v 12 podporovaných API ovládačov jazykov (a mnohých ďalších od komunity), v GUI Compass a Karta Atlas Collections (Prieskumník údajov). Dotazovací jazyk MongoDB nie je vôbec rovnaký ako SQL, ale existuje medzi nimi viac-menej priame mapovanie. Hovorím „viac-menej“, pretože relačné databázy nepodporujú vložené dokumenty, ale MongoDB áno. To nie je nevyhnutne všetko dobré, ako uvidíte v nasledujúcej časti.

MongoDB MongoDB

Agregačný rámec MongoDB používa operátory potrubia, ktoré sú viac-menej ekvivalentom SQL SKUPINA PODĽA a KDE doložky. Napríklad nasledujúci dotaz používa databázu skupín používateľov MongoDB na výpis minulých udalostí a celkových RSVP pre každú udalosť v prostredí Mongo:

> 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-skupina používateľov ',' Boston-MongoDB-skupina používateľov ']}}},

{'$ 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}}])

Dotaz používa agregát funkcia s $ zápas, $ in, $ skupina, $ sumaa $ projekt operátorov a vráti nasledujúce:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Zadajte „to“ viac

MongoDB má tiež mapReduce funkcia. Compass GUI má agregačný nástroj na tvorbu potrubí, vďaka ktorému je vytváranie dotazov, ako je ten vyššie, pomerne jednoduché.

MongoDB podporuje celý rad úrovní konzistencie dát servera počnúc od čítať nezáväzne a idem do kauzálny. Príčinná konzistencia bola pridaná až vo verzii 3.6 a je podporovaná aj v reláciách klienta. Klient nastaví čítanie a zápis obavy určiť požadovanú úroveň konzistencie.

V MongoDB je operácia zápisu atómová na úrovni jedného dokumentu, aj keď táto operácia upravuje viac vložených dokumentov v jednom dokumente. Pri jednej operácii zápisu (napr. db.collection.updateMany ()) upravuje viac dokumentov, úprava každého dokumentu je atómová, ale operácia ako celok nie je atómová. Počnúc verziou 4.0 pre situácie, ktoré vyžadujú atomicitu pri aktualizáciách viacerých dokumentov alebo konzistenciu medzi čítaním viacerých dokumentov, poskytuje MongoDB transakcie viacerých dokumentov pre množiny replík za cenu výkonu.

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