MongoDB

**MongoDB** on useilla eri alustoilla toimiva MongoDB Inc:n kehittämä dokumentti-orientoitunut tietokantaohjelmisto. MongoDB kuuluu ns. NoSQL-tietokantajärjestelmiin perinteisten relaatiomallia käyttävien sijaan. 
MongoDB on saatavilla Server Side Public License (SSPL) lisenssin ehdoilla.
Ohjelmiston käyttämä tiedostomuoto on JSON-muodon kaltainen. 

## Historia
Ohjelmistoyritys 10gen aloitti MongoDB:n kehittämisen vuonna 2007 osana laajempaa alustaprojektia. Vuonna 2009 yritys vaihtoi toimintamalliksi avoimen lähdekoodin kehittämisen ja tukipalveluiden tarjoamisen. Vuonna 2013 10gen vaihtoi nimensä MongoDB Inc:ksi.
Lokakuussa 2017 MongoDB Inc listautui NASDAQ-pörssiin. 
Lokakuussa 2019 MongoDB liittoutui Alibaba Cloud –pilvipalvelun kanssa. MongoDB:ta tarjotaan palveluna Alibaban datakeskuksissa. 

## Keskeiset piirteet
### Kyselyt tilanteen mukaan ja sisällön indeksointi
MongoDB:llä voi tehdä hakuja tietokenttien nimien ja sisällön arvoalueiden perusteella sekä käyttäen säännöllisiä lausekkeita (), joilla kuvataan etsityn merkkijonon muoto.
Tietokenttiä voidaan indeksoida sekä yksikäsitteisiin primaari-indekseihin että toissijaisiin indekseihin.

### Replikointi eli tiedon paikalliset kopiot
MongoDB:n tietokannoista on vaivatonta tuottaa paikallisia kopioita eli replikoita.

Kukin replika koostuu yhdestä tai useammasta datan kopiosta. Replikan osana olevat kopiot voivat toimia ensi- tai toissijaisina kopioina. Oletusarvoisesti luetaan ja kirjoitetaan ensisijaista kopiota. Toissijainen kopio toimii varmistuksena. Jos ensisijaisen kopion käyttö tai päivitys epäonnistuu, kukin replika määrittää automaattisesti, mistä toissijaisesta kopiosta tulee uusi ensisijaisesti käytettävä kopio. Toissijaisia kopioita voidaan lukea, mutta niiden sisällön ei katsota välttämättä olevan ensisijaisen kopion kanssa yhteneviä.

### Kuormituksen jakaminen
MongoDB mukautuu suurempaan kuormitukseen sharding-periaatteella.

Käyttäjä määrittää kriteerin (shard key), jonka mukaan tietokannan kuormitus hajautetaan. Hajautus voidaan tehdä myös satunnaisesti, jolloin kuormitus on tasainen, tietokannan sisältöön perustuvasta kriteeristä riippumaton. MongoDB voi käyttää useita palvelimia joko kuormituksen jakamiseen tai varmistamaan toiminnan jatkuminen laitevian tapahtuessa.

### Tiedostojärjestelmä
MongoDB:ta voidaan käyttää myös tiedostojärjestelmänä,josta käytetään nimeä GridFS. Sillä voidaan jakaa kuormitusta ja hallita tiedon paikallisia kopioita. GridFS toteutetaan MongoDB:n ajuriohjelmilla, kuten Nginx-pluginilla ja lighttpd:llä, jotka tarjoavat toimintoja tiedostojen käsittelyyn.

GridFS jakaa tiedostot osiin ja tallentaa kunkin osan erilliseksi dokumentiksi, joka on MongoDB:ssä tallennuksen looginen perusyksikkö.

### Tietojen koostaminen ja ryhmittely
MongoDB:ssä on kolme tapaa koostaa ja ryhmitellä dataa: putki, Map-reduce–funktio ja erikoistuneet koostamismenetelmät. Putki (pipeline) toimii UNIX:in putken tapaan toteuttaen peräkkäin useita toimintoja. Map-reduce-funktio tutkii datan ominaisuuksia ja tiivistää sitä laskennallisesti.

MongoDB:n tarjoamat datan koostamistoiminnot näkyvät käyttäjälle samaan tapaan kuin SQL:n `GROUP BY` –lauseen tulokset. $lookup-operaattorilla voi yhdistää dokumentteja eri kokoelmista ja suorittaa niille tilastolaskentaa, kuten laskea normaalijakauman.

### JavaScriptin käyttö palvelinpäässä
JavaScriptiä voidaan käyttää kyselyihin ja datan koostamiseen. Sillä voidaan myös kirjoittaa koodia tietokannassa suoritettavaksi.

### Kooltaan rajatut kokoelmat ja rengaspuskuri
MongoDB tukee kooltaan rajattuja kokoelmia (capped collections). Kun kokoraja saavutetaan, MongoDB käsittelee kokoelmia rengaspuskurin periaatteella: tieto tallennetaan kiinteässä järjestyksessä ja tilan täyttyessä tiedon tallennuspaikka siirtyy takaisin rakenteen alkuun.

## Väitteet ACID-transaktioihin kykenemisestä
MongoDB:n on väitetty tukevan usean dokumentin keskeisiä ACID-transaktioita kesäkuussa 2018 julkaistusta versio 4.0:sta lähtien.
Väite ei pidä paikkaansa, koska MongoDB ei toteuta snapshot isolation –ominaisuutta.

## Versiot
* *MongoDB Community Server*, ilmainen, saatavissa Windows, Linux, OS X.
* *MongoDB Enterprise Server*, kaupallinen versio, sisältyy osana MongoDB Enterprise Advanced –pakettiin.
* *MongoDB Atlas*, MongoDB on-demand –palveluna, toimii AWS-, Microsoft Azure -, Google Cloud Platform –alustoilla.

## Arkkitehtuuri
Eri ohjelmointikielten käyttömahdollisuudet: MongoDB:lle on saatavilla viralliset ajurit tärkeimpiin ohjelmointikieliin ja kehitysympäristöihin. On myös epävirallisia, yhteisöllisesti ylläpidettyjä muiden ohjelmointikielten ja kehysten ajureita.

Asiakasohjelmien toteutuskirjastoja on saatavilla JavaScriptille, iOS:lle  ja Androidille.

## Lisensointi
### MongoDB Community Server
MongoDB lisensoitiin lokakuussa 2018 Server Side Public License –lisenssillä (SSPL), joka on projektin itsensä kehittämä. SSPL korvaa GNU Affero General Public License -lisenssin (AGPL) ja on lähes identtinen GNU General Public License version 3 –lisenssin kanssa, mutta edellyttää, että niiden, jotka tarjoavat ohjelmaa palvelun osana, täytyy julkaista palvelun lähdekoodi tällä lisenssillä.

SSPL lähetettiin Open Source Initiativen sertifioitavaksi, mutta vedettiin pois tästä prosessista. Kieliajurit ovat saatavilla Apachen lisenssillä. Lisäksi MongoDB Inc. tarjoaa ohjelmistoa erityisehtojen mukaisilla lisensseillä (proprietary licenses). Viimeisimmät AGPL version 3 –lisenssin mukaiset versiot ovat 4.0.3. (vakaa versio) ja 4.1.4.  

Lisensoinnin muututtua MongoDB ei ole enää mukana Debian-, Fedora- ja Red Hat Enterprise Linux -jakeluissa. Fedora on päättänyt, että SSPL version 1 ei ole vapaa ohjelmisto, koska se on ”tietoisesti suunniteltu aggressiivisesti diskriminoivaksi” kaupallisia käyttäjiä kohtaan.

## Ongelmahavaintoja ja kritiikkiä
### Turvallisuus
MongoDB:n turvallisuusasetusten oletusarvot sallivat kenelle tahansa täydet oikeudet tietokantaan. Tämä on saanut aikaan, että kymmeniä tuhansia MongoDB-asennuksia on kaapattu. Moniin MongoDB-palvelimiin on hyökätty kiristyshaittaohjelmilla.

### Tekniikan kritiikkiä
Eräissä virhetilanteissa, joissa sovellus käyttää kahta erillistä MongoDB-prosessia, mutta näillä prosesseilla ei ole pääsyä toistensa tietoihin, on mahdollista, että MongoDB tuo vanhentunutta tietokantasisältöä (engl. stale reads). Näissä tilanteissa on myös mahdollista, että MongoDB palauttaa tietokannan aiempaan tilaan (engl. roll back).

Tämä ongelma havaittiin marraskuussa 2016 julkaistussa versiossa 3.4.0. Ongelma korjattiin takautuvasti versioon 3.2.12 asti.

Ennen versiota 2.2 lukitus toteutettiin serveriprosessikohtaisesti. Version 2.2 myötä lukitus alettiin toteuttaa tietokantatasolla. Versiosta 3.0 lähtien otettiin käyttöön uudenlaiset tallentimet (pluggable storage engines). Kukin tallennin toteuttaa lukitukset erikseen. MongoDB 3.0:ssa lukitus toteutetaan kokoelmien tasolla MMAPv1-tallentimella. WiredTiger-tallennin käyttää optimistista yhtäaikaisuudenhallintaa, joka tuottaa dokumenttitason lukitukset.

Ennen versiota 3.0 yksi tapa käsitellä yhtäaikaisuutta on *sharding* eli tietokannan hajauttaminen tietyn avaimen arvojen mukaan.
Joissakin tilanteissa luku- ja kirjoitusoperaatiot avaavat lukituksen. Mikäli MongoDB ennustaa, ettei sivu todennäköisesti ole muistissa, lukitus aukeaa kun sivuja ladataan. Lukituksen avaamista käytetään laajemmin versiossa 2.2.

Joissakin tilanteissa luku- ja kirjoitusoperaatiot avaavat lukituksen. Mikäli MongoDB ennustaa, ettei sivu todennäköisesti ole muistissa, lukitus aukeaa kun sivuja ladataan. Lukituksen avaamista käytetään laajemmin versiossa 2.2.
Versioon 3.3.11 asti MongoDB ei kyennyt lajittelemaan Unicodea käyttäviä ei-englanninkielisiä aineistoja oikein käytössä olleella tavuttain vertailulla (memcmp). Ongelma korjattiin 23.8.2016.   

Ennen versiota 4.0 indeksihaut eivät olleet atomisia. Tästä aiheutui, että hausta saattoi jäädä pois dokumentteja, joita päivitettiin haun ollessa meneillään. Snapshot read –piirre versiossa 4.0 poisti tämän ongelman.

## Tunnettuja käyttäjiä
MongoDB:n tunnettuja käyttäjiä ovat Barclays, Bosch, Cisco, Chicagon kaupunki, Codeacademy, Coinbase, eBay, Foursquare, HSBC, IBM, Orange S.A., Sega, The Gap Inc. ja Uber.

## MongoDB World -konferenssi
Vuodesta 2014 lähtien on järjestetty vuotuisia MongoDB World –kehittäjäkonferensseja.

## Lähteet