Ohjelmointi

Katsaus: MongoDB vie maailman

Jos olet rakentanut keskisuuren tai suuren mittakaavan verkkosovelluksen viime vuosina, harkitsit todennäköisesti avoimen lähdekoodin LAMP- tai MEAN-pinon perustamista. Vanhempi LAMP-pino käyttää Linux-käyttöjärjestelmää, Apache-verkkopalvelinta, MySQL-relaatiotietokantaa ja PHP-ohjelmointikieliä. MEAN käyttää MongoDB NoSQL -tietokantaa, Express-back-end-verkkosovelluskehystä, Angular-sovellusalustaa ja Node.js-JavaScript-ajonaikaa. MEAN on pohjimmiltaan end-to-end JavaScript-pino. Linuxia ei nimenomaisesti mainita lyhenteessä, mutta se on yleensä Solmun alla oleva käyttöjärjestelmä.

Tässä katsauksessa käsittelen MongoDB-tietokantaa, nyt versiossa 4. MongoDB on erittäin skaalautuva, toiminnallinen tietokanta, joka on saatavana sekä avoimen lähdekoodin että kaupallisten yritysten versioina, ja sitä voidaan käyttää paikan päällä tai hallittuna pilvipalveluna. Hallinnoitua pilvipalvelua kutsutaan MongoDB Atlasiksi.

MongoDB on kaukana suosituin NoSQL-tietokannoista. Sen asiakirjatietomalli antaa kehittäjille suuren joustavuuden, kun taas hajautettu arkkitehtuuri mahdollistaa suuren skaalautuvuuden. Tämän seurauksena MongoDB valitaan usein sovelluksille, joiden on hallittava suuria tietomääriä, hyötyvät horisontaalisesta skaalautuvuudesta ja jotka käsittelevät tietorakenteita, jotka eivät sovi relaatiomalliin.

Koska MongoDB soveltuu monenlaisiin käyttötapauksiin, sitä käytetään usein korvaamaan relaatiotietokantoja. Vaikka vapaus jäykistä skeemarajoitteista on usein hyödyllistä, on tärkeää pitää mielessä, että mikään asiakirjatietokanta ei ole universaali ratkaisu - edes MongoDB.

MongoDB-alkuperää

MongoDB: n takana olevan yrityksen perusti Internet-mainontayrityksen DoubleClickin takana oleva tiimi vuonna 2007 10gen-nimisenä. MongoDB-tietokannan alkuperäinen motivaatio oli pystyä käsittelemään Internet-mainonnassa tarvittavaa ketteryyttä ja mittakaavaa. Esimerkkinä mittakaavasta DoubleClick näytti 400 000 mainosta sekunnissa vuonna 2007 ja yritti toimia nykyisten tietokantojen kanssa.

MongoDB on asiakirjapohjainen myymälä, jonka päällä on myös graafipohjainen myymälä. Muita NoSQL-tietokantoja ovat avainarvomyymälät ja sarakepohjaiset myymälät. Kaikenlaisilla NoSQL-tietokannoilla on kyky laajentaa tapoja, jotka eivät olleet mahdollisia vuoden 2007 SQL-relaatiotietokannoissa, mutta NoSQL-tietokantojen eri muodoilla on erilaiset vahvuudet, heikkoudet ja käyttötapaukset.

Jotkut tärkeimmistä NoSQL-kilpailijoista MongoDB: lle operatiivisina tietokantoina ovat Amazon DynamoDB (avainarvosäilö), Google Cloud BigTable (sarakemyymälä), Google Cloud Datastore (dokumenttikauppa), Redis (muistissa, avainarvosäilö), Couchbase (monimallinen avainarvo- ja asiakirjavarasto), DataStax / Cassandra (sarakemyymälä) ja Azure Cosmos DB (monimalli, joka sisältää SQL-vaihtoehdon sekä useita NoSQL-myymälöitä).

Mikä on MongoDB?

MongoDB Inc. kuvaa MongoDB: tä "asiakirjatietokantana, jonka skaalautuvuus ja joustavuus ovat haluamasi kyselyn ja indeksoinnin kanssa". Sen jäsentämiseksi meidän on ensin ymmärrettävä asiakirjatietokannan luonne, joka on eräänlainen NoSQL-suunnittelu.

Sen sijaan, että tallennettaisiin voimakkaasti kirjoitettua dataa niihin liittyviin normalisoituihin taulukoihin, joissa on kiinteät skeemat, kuten relaatiotietokanta, asiakirjatietokanta tallentaa niihin liittyvät tiedot normalisoitumattomassa muodossa upotettuna JSON-tyyppisiin nimi-arvoasiakirjoihin. MongoDB ei kuitenkaan todellakaan tallenna JSON: a: MongoDB tallentaa BSON: n (Binary JSON), joka laajentaa JSON-esitystä (merkkijonoja) sisällyttämällä siihen muita tyyppejä, kuten int, pitkä, Päivämäärä, kelluva piste, desimaali128ja paikkatieteelliset koordinaatit, kuten alla olevassa kaaviossa on esitetty. BSON-asiakirjoissa on yksi tai useampi kenttä, ja jokainen kenttä sisältää tietyn tietotyypin arvon, mukaan lukien taulukot, binaaritiedot ja alidokumentit. BSON seuraa myös kunkin asiakirjan kokoa tehokkaan etsinnän mahdollistamiseksi.

MongoDB

BSON-kirjoittaminen syöttää kenttien indeksointiin. MongoDB voi luoda multimodaalisen kuvaajan, paikkatieto-, B-puu- ja kokotekstihakemistot yhdestä kopiosta tiedoista käyttämällä oikeanlaisen hakemistotyypin tietojen tyyppiä. MongoDB: n avulla voit luoda hakemistoja mille tahansa asiakirjakentälle.

MongoDB

MongoDB: llä on tietokantoja, kokoelmia (taulukoita), asiakirjoja (rivejä), kenttiä (sarakkeita), hakemistoja, $ haku tai upotetut asiakirjat (liittymät), ensisijaiset avaimet, koontiputki ja tapahtumat. Suorituskyvyn parantamiseksi ja monidokumenttitapahtumien välttämiseksi sinun kannattaa todennäköisesti käyttää alidokumentteja ja taulukoita MongoDB: ssä sen sijaan, että tallennat tietojasi normalisoituun muotoon samalla tavalla kuin SQL-tietokantaan.

MongoDB 4 tekee sinulla on monidokumenttitransaktioita, mikä tarkoittaa, että voit silti saada ACID-ominaisuuksia, vaikka sinun on normalisoitava tietosuunnittelu. Aiemmat versiot eivät.

MongoDB: n edustajat kertoivat minulle sen arvoista, että yhden asiakirjan tapahtumat käsittelevät 90 prosenttia ACID-ominaisuuksia tarvitsevista käyttötapauksista. Kun asiakkaat tarvitsivat ACID: ää monidokumenttitapahtumiin ennen versiota 4, he toteuttivat sen itse sovellustasolla.

Oletuksena MongoDB käyttää dynaamisia skeemejä, joita joskus kutsutaan skeemattomiksi. Yhden kokoelman asiakirjat tekevät ei tarvitsee olla sama joukko kenttiä, ja kentän tietotyyppi voi olla erilainen kokoelman asiakirjoissa. Voit muuttaa asiakirjan rakennetta milloin tahansa.

Järjestelmän hallinta on kuitenkin käytettävissä. Alkaen MongoDB 3.6: sta, MongoDB tukee JSON-mallin tarkistusta. Käynnistä se käyttämällä $ jsonSchema operaattori validointilausekkeessasi. Vahvistus tapahtuu päivitysten ja lisäysten aikana.

Kuten alla olevasta dokumentaation tilannekuvasta ja MongoDB Atlas -kuvakaappauksesta näet, MongoDB: llä on oma kyselykieli, joka on toteutettu Mongo-kuoressa, 12 tuetussa kieliohjaimen sovellusliittymässä (ja monissa muissa yhteisössä) ja Compass-käyttöliittymässä ja Atlas-kokoelmat-välilehti (Data Explorer). MongoDB-kyselykieli ei ole lainkaan sama kuin SQL, mutta näiden kahden välillä on enemmän tai vähemmän suora kartoitus. Sanon "enemmän tai vähemmän", koska relaatiotietokannat eivät tue upotettuja asiakirjoja, mutta MongoDB tukee. Se ei välttämättä ole kaikki hyvä, kuten näet seuraavasta osiosta.

MongoDB MongoDB

MongoDB-aggregaatiokehys käyttää putkioperaattoreita, jotka vastaavat suunnilleen SQL: ää RYHMÄ ja MISSÄ lausekkeet. Esimerkiksi seuraava kysely käyttää MongoDB: n käyttäjäryhmätietokantaa Mongo-kuoren luetteloon aiempien tapahtumien ja kunkin tapahtuman vastausten kokonaismäärän:

> db.past_events.aggregate ([{'$ match': {'batchID': 101, 'event.status': 'past', 'event.group.urlname': {'$ in': ['Atlanta-MongoDB -Käyttäjäryhmä ',' Austin-MongoDB-Käyttäjäryhmä ',' Baltimore-MongoDB-Käyttäjäryhmä ',' Bangalore-MongoDB-Käyttäjäryhmä ',' Belfast-MongoDB-Käyttäjäryhmä ',' Bergen-NoSQL ',' Bordeaux-MongoDB-User-Group ',' Boston-MongoDB-User-Group ']}}},

{'$ group': {'_id': {'urlname': '$ event.group.urlname', 'vuosi': {'$ 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}}])

Kysely käyttää aggregaatti toiminto $ ottelu, $ sisään, $ -ryhmä, $ summaja $ projekti operaattorit ja palauttaa seuraavat:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kirjoita "it" saadaksesi lisää

MongoDB: llä on myös a mapPienennä toiminto. Compass-käyttöliittymässä on yhdistämisputken rakennustyökalu, joka tekee yllä olevien kaltaisten kyselyjen luomisesta melko suoraviivaista.

MongoDB tukee useita palvelintietojen yhdenmukaisuustasoja alkaen lukea sitomaton ja menossa kausaalinen. Syy-johdonmukaisuus lisättiin vain versioon 3.6, ja sitä tuetaan myös asiakasistunnoissa. Asiakas asettaa lukemaan ja kirjoittamaan huolenaiheita Määritä haluttu sakeustaso.

MongoDB: ssä kirjoitusoperaatio on atominen yhden asiakirjan tasolla, vaikka toiminto muokkaaisikin useita upotettuja asiakirjoja yhteen asiakirjaan. Kun yksi kirjoitusoperaatio (esim. db.collection.updateMany ()) muuttaa useita asiakirjoja, jokaisen asiakirjan muokkaus on atominen, mutta toiminta kokonaisuutena ei ole atominen. Versiosta 4.0 alkaen tilanteissa, joissa useiden asiakirjojen päivittäminen vaatii atomiikkaa tai useiden asiakirjojen lukemien välinen yhdenmukaisuus, MongoDB tarjoaa monidokumenttitransaktiot kopiosarjoille suorituskyvyn kustannuksella.

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