MongoDB 1.0: il database documentale che inaugura l'era NoSQL pratica

MongoDB 1.0 (agosto 2009) di 10gen: database documentale JSON-native, BSON come formato binario, shell JavaScript, licenza AGPL 3.0. L'ingresso concreto del paradigma NoSQL nello sviluppo web mainstream.

Open SourceWebR&D MongoDBNoSQL10genDatabaseDocument StoreCloudOpen SourceFull-Stack

Oltre il relazionale

La prima decade del 2000 ha visto un consolidamento dei database relazionali open source — MySQL e PostgreSQL come scelte dominanti — affiancato a un crescente disagio verso il modello relazionale per scenari emergenti: web applications con schemi che evolvono rapidamente, social network con strutture a grafo, analytics su dataset eterogenei, IoT con flussi semistrutturati.

Il termine NoSQL — riemerso nel 2009 in un meetup di San Francisco — identifica una famiglia di approcci alternativi: key-value store (Riak, Voldemort, Dynamo), column family (Cassandra, HBase), graph database (Neo4j), document store. Tra i document store, MongoDB è quello che raggiunge per primo una produzione largamente utilizzata.

MongoDB 1.0 è stato rilasciato l’11 agosto 2009 da 10gen (Eliot Horowitz, Dwight Merriman, Kevin Ryan), azienda fondata nel 2007 inizialmente per costruire una piattaforma PaaS, poi ripiegata sul solo database.

Il modello dati

MongoDB memorizza documenti — unità fondamentale, analoghe a oggetti JSON — raggruppati in collection dentro database. Non c’è schema predefinito: documenti della stessa collection possono avere campi diversi.

Il formato di serializzazione è BSON (Binary JSON), estensione binaria di JSON con tipi di dato aggiuntivi (ObjectId, Date, Binary, Regex, Int32/64, Decimal128).

Un documento tipico:

{
    "_id": ObjectId("4f7d3e8b..."),
    "nome": "Mario Rossi",
    "età": 52,
    "indirizzi": [
        { "tipo": "casa", "città": "Pisa" },
        { "tipo": "lavoro", "città": "Firenze" }
    ],
    "tags": ["cliente-premium", "abbonato"]
}

Operazioni CRUD:

  • db.clienti.insert(doc) — inserimento
  • db.clienti.find({tags: "cliente-premium"}) — query con filtri MongoDB-specifici
  • db.clienti.update({_id: ...}, {$set: {...}}) — update con operatori atomici
  • db.clienti.remove({...}) — cancellazione

La shell JavaScript

MongoDB espone una shell interattiva basata su JavaScript V8 (Mongo Shell). Le query sono letteralmente JavaScript; operazioni complesse (aggregazioni, map-reduce) sono scritte come funzioni JS eseguite lato server. Questa scelta è naturale per sviluppatori web già familiari con JS e renderà MongoDB particolarmente popolare nell’ecosistema Node.js (che emergerà parallelamente, 2009).

Indici, query optimizer, concorrenza

MongoDB 1.0 supporta:

  • Indici — B-tree su campi singoli o composti, con unique constraint
  • Query optimizer — sceglie il miglior indice, con possibilità di hint manuale
  • Lock a granularità database (globale nel 1.0, migliorerà a lock per collezione in 2.x, lock per documento in 3.x con WiredTiger)
  • Transazioni limitate a singolo documento (multi-documento arriverà in 4.0, 2018)

La mancanza di transazioni multi-documento ACID è un compromesso esplicito: MongoDB privilegia scala orizzontale e velocità su atomicità di transazioni complesse. Questo è un punto di attrito con applicazioni finanziarie/contabili tradizionali; è accettabile — o gestibile — in applicazioni web, analytics, logging.

Replicazione e sharding

MongoDB 1.0 già supporta:

  • Master/Slave replication (poi replica set con failover automatico in 1.6)
  • Sharding orizzontale (in preparazione per 1.6, settembre 2010)
  • Map-reduce server-side per aggregazioni

L’ambizione dichiarata è scalare a molti nodi senza riscrivere l’applicazione. La promessa si rivelerà parzialmente vera: sharding MongoDB è sofisticato ma richiede progettazione attenta della shard key.

Licenza AGPL 3.0 e controversie

La scelta di distribuire il server MongoDB sotto licenza GNU AGPL 3.0 — Affero GPL — è stata controversa. AGPL estende il copyleft di GPL al caso di “uso via rete”: un servizio SaaS che espone MongoDB modificato dovrebbe rendere disponibile il codice. Nel 2009 AGPL è meno accettata di Apache 2.0 o MIT in ambienti enterprise, molti CIO hanno riserve.

10gen risponde con:

  • Driver client distribuiti sotto Apache 2.0 — le applicazioni che usano MongoDB non sono “contaminate”
  • MongoDB Enterprise — sottoscrizione commerciale con QA, supporto, auditing
  • Successivamente (2018), passaggio a SSPL (Server Side Public License) — altra licenza controversa, non riconosciuta come open source da OSI, motivata dai cloud provider che offrivano MongoDB-as-a-service senza contribuire

Driver e integrazione

Al rilascio 1.0 MongoDB ha driver per:

  • Python — PyMongo, maturo
  • Ruby — per Ruby on Rails
  • PHP — driver ufficiale
  • Java — per applicazioni enterprise
  • C#/.NET — driver community

Il driver Node.js diventerà rapidamente uno dei più usati, alimentando lo stack MEAN (MongoDB + Express + Angular + Node) nei primi anni 2010.

Adozione

Al 2009-2010 MongoDB è adottato da:

  • Craigslist — archivio classifieds
  • Foursquare — social check-in
  • bit.ly — URL shortener
  • The New York Times — form data management
  • SourceForge — migrazione da MySQL

Le applicazioni tipiche: content management, cataloghi prodotti, sessioni utente, logging, contenuti user-generated, dati IoT.

Nel contesto italiano

Al 2009 l’adozione italiana di MongoDB è limitata a:

  • Startup e agenzie web che esplorano stack non-relazionali
  • Università — progetti di ricerca su NoSQL
  • Alcuni siti editoriali — gestione contenuti

L’adozione crescerà nel 2011-2013 parallelamente al boom del paradigma NoSQL.

Il ruolo storico

MongoDB 1.0 democratizza l’approccio NoSQL: con un mongodb:// di connessione e un driver installato in qualche minuto, uno sviluppatore può costruire un’applicazione con storage documentale senza la cerimonia dello schema SQL. Non è tecnicamente il primo document store (Lotus Notes, CouchDB sono precedenti), ma è quello che raggiunge prima una massa critica di adozione, definendo de facto il pattern NoSQL “moderno”. I database emergenti negli anni successivi — in particolare il rilancio di PostgreSQL con JSONB nel 2014 — risponderanno al modello MongoDB assimilandone parte delle idee.


Riferimenti: MongoDB 1.0 (11 agosto 2009), 10gen Inc. (poi MongoDB Inc.). Eliot Horowitz, Dwight Merriman, Kevin Ryan. Licenza AGPL 3.0 (server), Apache 2.0 (driver). Formato BSON. Shell basata su JavaScript V8.

Vuoi supporto? Sei sotto attacco? Stato dei servizi
Vuoi supporto? Sei sotto attacco? Stato dei servizi