{"id":56615,"date":"2022-06-27T08:04:44","date_gmt":"2022-06-27T07:04:44","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=56615&#038;post_type=knowledgebase&#038;preview_id=56615"},"modified":"2025-10-01T20:46:51","modified_gmt":"2025-10-01T19:46:51","slug":"cosa-e-mongodb","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/","title":{"rendered":"Cos&#8217;\u00e8 MongoDB? Tutto sul Popolare Database Open Source"},"content":{"rendered":"<p>Se siete curiosi di entrare nel mondo del database MongoDB, questo \u00e8 il tutorial che fa per voi. Scoprirete come installare il software, manipolare i dati e applicare le tecniche di progettazione dei dati alle vostre applicazioni.<\/p>\n<p>Tutti gli esempi sono stati sviluppati con MongoDB 5, ma la maggior parte funzioner\u00e0 anche con versioni precedenti o successive. Il codice pu\u00f2 essere inserito direttamente in un&#8217;applicazione client o nella shell di MongoDB (mongo o mongosh) per interrogare e aggiornare il database.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Cos&#8217;\u00e8 MongoDB?<\/h2>\n<p>MongoDB \u00e8 un <a href=\"https:\/\/kinsta.com\/it\/blog\/open-source-database\/\">database NoSQL open source<\/a>. NoSQL significa che il database non utilizza tabelle relazionali come un <a href=\"https:\/\/kinsta.com\/it\/blog\/mongodb-vs-mysql\/\">database SQL tradizionale<\/a>.<\/p>\n<p>Esistono diversi tipi di database NoSQL, ma MongoDB memorizza i dati in oggetti simili a JavaScript, noti come <em>documenti<\/em>, il cui contenuto \u00e8 simile a questo:<\/p>\n<pre><code class=\"language-bash\">{\n  _id: \"123\",\n  name: \"Craig\"\n}<\/code><\/pre>\n<p><br \/>\nSebbene MongoDB sia diventato sinonimo di framework <a href=\"https:\/\/kinsta.com\/it\/blog\/node-js\/\">Node.js<\/a> basato su JavaScript, i <a href=\"https:\/\/www.mongodb.com\/docs\/drivers\/\">driver ufficiali del database<\/a> MongoDB sono disponibili per la maggior parte dei framework, linguaggi e runtime, tra cui <a href=\"https:\/\/www.mongodb.com\/docs\/drivers\/node\/current\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js<\/a>, <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-python\/\">PHP e Python<\/a>. Si pu\u00f2 anche optare per librerie come <a href=\"https:\/\/www.npmjs.com\/package\/mongoose\" target=\"_blank\" rel=\"noopener noreferrer\">Mongoose<\/a>, che offrono un livello di astrazione pi\u00f9 elevato o funzioni di mappatura relazionale degli oggetti (ORM).<\/p>\n<p>A differenza delle tabelle SQL, non ci sono limiti strutturali a ci\u00f2 che si pu\u00f2 memorizzare in MongoDB. Gli schemi dei dati non vengono applicati: potete memorizzare quello che volete dove volete. Questo rende MongoDB ideale per le strutture di dati pi\u00f9 organiche <em>o disordinate<\/em>.<\/p>\n<p>Considerate una rubrica di contatti. Spesso le persone hanno pi\u00f9 numeri di telefono. Potreste definire tre campi telefono in una tabella SQL, ma sarebbero troppi per alcuni contatti e troppo pochi per altri. In ultima analisi, vi servir\u00e0 una tabella telefonica separata, che aggiunger\u00e0 ulteriore complessit\u00e0.<\/p>\n<p>In MongoDB, i numeri di telefono possono essere definiti come un array illimitato di oggetti nello stesso documento:<\/p>\n<pre><code class=\"language-bash\">{\n  _id: \"123\",\n  name: \"Craig\",\n  telephone: [\n    { home: \"0123456789\" },\n    { work: \"9876543210\" },\n    { cell: \"3141592654\" }\n  ]\n}<\/code><\/pre>\n<p>\u00c8 importante notare che MongoDB utilizza una notazione simile a quella degli oggetti JavaScript per gli aggiornamenti dei dati e le query, il che pu\u00f2 rappresentare una sfida se si \u00e8 abituati a usare l&#8217;SQL.<\/p>\n<h2>Elementi di MongoDB<\/h2>\n<p>Prima di andare avanti, diamo un&#8217;occhiata agli elementi che caratterizzano MongoDB. Utilizzeremo questo vocabolario in tutto l&#8217;articolo.<\/p>\n<ul>\n<li><strong>Documento:<\/strong> Un singolo oggetto in un archivio di dati, analogo a un record o a una riga in una tabella di un database SQL.<\/li>\n<li><strong>Campo:<\/strong> Un singolo dato all&#8217;interno di un documento, come un nome o un numero di telefono, analogo a un campo o a una colonna di una tabella SQL.<\/li>\n<li><strong>Raccolta:<\/strong> Un insieme di documenti simili, analogo a una tabella SQL. Anche se potreste inserire tutti i vostri documenti in un&#8217;unica raccolta, di solito \u00e8 pi\u00f9 pratico raggrupparli in tipi specifici. In una rubrica di contatti potreste avere una raccolta per le persone e una per le aziende.<\/li>\n<li><strong>Database:<\/strong> Una raccolta di dati correlati, identica nel significato a un database SQL.<\/li>\n<li><strong>Schema:<\/strong> Uno schema definisce le strutture dei dati. Nei database SQL \u00e8 necessario definire le definizioni delle tabelle con i relativi campi e tipi prima di poter memorizzare i dati. In MongoDB questo non \u00e8 necessario, anche se \u00e8 possibile creare uno schema che convalidi i documenti prima che possano essere aggiunti a una raccolta.<\/li>\n<li><strong>Indice:<\/strong> Una struttura di dati utilizzata per migliorare le prestazioni delle query, identica nel significato agli indici di SQL.<\/li>\n<li><strong>Chiave primaria:<\/strong> Un identificatore unico per ogni documento. MongoDB aggiunge automaticamente un campo _id unico e indicizzato a ogni documento di una raccolta.<\/li>\n<li><strong>Denormalizzazione:<\/strong> Nei database SQL, la &#8220;normalizzazione&#8221; \u00e8 una tecnica utilizzata per organizzare i dati ed eliminare le duplicazioni. In MongoDB, la &#8220;denormalizzazione&#8221; \u00e8 incoraggiata. I dati si ripetono attivamente e un singolo documento potrebbe contenere tutte le informazioni necessarie.<\/li>\n<li><strong>Joins:<\/strong> SQL offre un <a href=\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\">operatore<\/a> JOIN che consente di recuperare i dati da pi\u00f9 tabelle normalizzate con un&#8217;unica query. Le unioni non erano possibili in MongoDB fino alla versione 3.6 e le limitazioni permangono. Questo \u00e8 un altro motivo per cui i dati dovrebbero essere denormalizzati in documenti autonomi.<\/li>\n<li><strong>Transazioni:<\/strong> Quando un aggiornamento modifica due o pi\u00f9 valori su un singolo documento, MongoDB si assicura che vadano tutti a buon fine o che falliscano tutti. Gli aggiornamenti di due o pi\u00f9 documenti devono essere racchiusi in una transazione. MongoDB supporta le transazioni dalla versione 4.0, ma \u00e8 necessario un set di repliche multi-server o un cluster sharded. Gli esempi di installazione riportati di seguito utilizzano un singolo server e quindi le transazioni non sono possibili.<\/li>\n<\/ul>\n<h2>Come Installare MongoDB<\/h2>\n<p>Esistono tre opzioni per utilizzare MongoDB sul proprio computer locale, e ve le illustreremo tutte, una per una.<\/p>\n<h3>1. Utilizzare Docker (Consigliato)<\/h3>\n<p><a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker<\/a> \u00e8 uno strumento di gestione del software che pu\u00f2 installare, configurare ed eseguire MongoDB o qualsiasi altra applicazione in pochi minuti.<\/p>\n<p><a href=\"https:\/\/dockerwebdev.com\/tutorials\/install-docker\/\" target=\"_blank\" rel=\"noopener noreferrer\">Installate Docker e Docker Compose<\/a> e create una cartella di progetto con un unico file chiamato docker-compose.yml con i seguenti contenuti (\u00e8 importante notare che i trattini sono essenziali):<\/p>\n<pre><code class=\"language-bash\">version: '3'\n\nservices:\n\n  mongodb:\n    image: mongo:5\n    environment:\n      - MONGO_INITDB_ROOT_USERNAME=root\n      - MONGO_INITDB_ROOT_PASSWORD=pass\n      - MONGO_INITDB_DATABASE=mongodemo\n    container_name: mongodb\n    volumes:\n      - dbdata:\/data\/db\n    ports:\n      - \"27017:27017\"\n\n  adminer:\n    image: dehy\/adminer\n    container_name: adminer\n    depends_on:\n      - mongodb\n    ports:\n      - \"8080:80\"\n\nvolumes:\n  dbdata:<\/code><\/pre>\n<p>Accedete alla cartella dalla riga di comando ed eseguite:<\/p>\n<pre><code class=\"language-bash\">docker-compose up<\/code><\/pre>\n<p>L&#8217;ultima versione di MongoDB 5 verr\u00e0 scaricata e lanciata. La prima volta ci vorranno alcuni minuti, ma le esecuzioni successive saranno molto pi\u00f9 rapide.<\/p>\n<p>Da notare che:<\/p>\n<ul>\n<li>Viene definito un account amministratore di MongoDB con ID &#8220;root&#8221; e password &#8220;pass&#8221;.<\/li>\n<li>I dati vengono salvati tra un riavvio e l&#8217;altro in un volume Docker chiamato dbdata.<\/li>\n<li>Viene fornito anche il <a href=\"https:\/\/kinsta.com\/it\/blog\/adminer\/\">client del database Adminer<\/a>.<\/li>\n<\/ul>\n<p>Si pu\u00f2 utilizzare qualsiasi client per database MongoDB per connettersi a localhost:27017 utilizzando l&#8217;ID &#8220;root&#8221; e la password &#8220;pass&#8221;. In alternativa, si pu\u00f2 accedere ad Adminer all&#8217;indirizzo <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:8080\/<\/a> ed effettuare il login con le seguenti credenziali:<\/p>\n<ul>\n<li><strong>Sistema:<\/strong> MongoDB (alpha)<\/li>\n<li><strong>Server:<\/strong> host.docker.internal<\/li>\n<li><strong>Nome utente:<\/strong> root<\/li>\n<li><strong>Password:<\/strong> pass<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Il server host.docker.internal funziona su dispositivi Mac e Windows con Docker Desktop. Gli utenti Linux devono utilizzare l&#8217;indirizzo IP di rete del dispositivo, non localhost (Adminer lo risolve con il proprio contenitore Docker).<\/p>\n<\/aside>\n\n<figure id=\"attachment_123495\" aria-describedby=\"caption-attachment-123495\" style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-123495 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/05\/adminer-login.png\" alt=\"Accesso ad Adminer\" width=\"900\" height=\"455\"><figcaption id=\"caption-attachment-123495\" class=\"wp-caption-text\">Accesso ad Adminer<\/figcaption><\/figure>\n<p>Adminer permette di ispezionare raccolte e documenti. Tenete presente, tuttavia, che le raccolte vengono chiamate &#8220;tables&#8221;:<\/p>\n<figure id=\"attachment_123494\" aria-describedby=\"caption-attachment-123494\" style=\"width: 1102px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-123494 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/05\/adminer-view.png\" alt=\"Raccolta in Adminer\" width=\"1102\" height=\"577\"><figcaption id=\"caption-attachment-123494\" class=\"wp-caption-text\">Raccolta in Adminer<\/figcaption><\/figure>\n<p>Per eseguire i comandi, \u00e8 possibile utilizzare la Shell MongoDB (<code>mongosh<\/code>) o l&#8217;ambiente REPL (Read Eval Print Loop) della riga di comando <code>mongo<\/code>.<\/p>\n<p>Accedete alla shell bash del contenitore Docker MongoDB:<\/p>\n<pre><code class=\"language-bash\">docker exec -it mongodb bash<\/code><\/pre>\n<p>Avviate quindi la shell MongoDB con l&#8217;ID e la password:<\/p>\n<pre><code class=\"language-bash\">mongosh -u root -p pass<\/code><\/pre>\n<p>(Se preferite, potete utilizzare il comando tradizionale <code>mongo<\/code>.)<\/p>\n<p>A questo punto potrete impartire a MongoDB comandi come i seguenti:<\/p>\n<ul>\n<li><strong><code>show dbs;<\/code><\/strong> &#8211; Mostrare tutti i database<\/li>\n<li><strong><code>use mongodemo;<\/code><\/strong> &#8211; Usare un database specifico<\/li>\n<li><strong><code>show collections;<\/code><\/strong> &#8211; Elencare le raccolte di un database<\/li>\n<li><strong><code>db.person.find();<\/code><\/strong> &#8211; Elencare tutti i documenti di una raccolta<\/li>\n<li><strong><code>exit;<\/code><\/strong> &#8211; Uscire\/chiudere la shell<\/li>\n<\/ul>\n<p>Chiudete MongoDB eseguendo il seguente comando dalla directory del progetto:<\/p>\n<pre><code class=\"language-bash\">docker-compose down<\/code><\/pre>\n<h3>2. Utilizzare un Provider Cloud (Senza Installazione)<\/h3>\n<p>\u00c8 anche possibile utilizzare un&#8217;istanza di MongoDB in hosting, quindi non c&#8217;\u00e8 bisogno di installare nulla in locale. Una connessione a internet \u00e8 essenziale e la velocit\u00e0 di risposta dipender\u00e0 dall&#8217;host e dalla larghezza di banda. La maggior parte dei servizi applica una tariffa mensile e\/o in Megabyte.<\/p>\n<p>Di solito l&#8217;host fornisce i dettagli per poter amministrare il database da remoto utilizzando il software client MongoDB.<\/p>\n<h3>3. Installare MongoDB in locale<\/h3>\n<p>MongoDB pu\u00f2 essere installato e configurato su Linux, Windows o Mac OS. Sono disponibili due edizioni:<\/p>\n<ol>\n<li>Una versione commerciale Enterprise<\/li>\n<li>Una Community Edition open source (utilizzata in questo tutorial)<\/li>\n<\/ol>\n<p>La <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/installation\/\" target=\"_blank\" rel=\"noopener noreferrer\">pagina di installazione di MongoDB<\/a> fornisce istruzioni per i vari sistemi operativi. In generale:<\/p>\n<ul>\n<li>Le versioni per Linux vengono installate utilizzando un gestore di pacchetti come <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/tutorial\/install-mongodb-on-ubuntu\/\" target=\"_blank\" rel=\"noopener noreferrer\">apt su Ubuntu<\/a><\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/tutorial\/install-mongodb-on-os-x\/\" target=\"_blank\" rel=\"noopener noreferrer\">Le versioni per Mac OS sono installate con brew<\/a><\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/tutorial\/install-mongodb-on-windows\/\" target=\"_blank\" rel=\"noopener noreferrer\">Le versioni per Windows sono installate con un programma di installazione .msi<\/a><\/li>\n<\/ul>\n<p>Assicuratevi di seguire attentamente le istruzioni affinch\u00e9 l&#8217;installazione abbia successo!<\/p>\n<h2>Come Accedere al Database MongoDB<\/h2>\n<p>Ora che il database MongoDB \u00e8 installato, \u00e8 il momento di imparare a gestirlo. Vediamo quali sono i passaggi per accedere e lavorare con il vostro database.<\/p>\n<h3>1. Installare un Client MongoDB<\/h3>\n<p>Per amministrare i database \u00e8 necessaria un&#8217;applicazione client MongoDB. Se state utilizzando un&#8217;installazione cloud o locale, vi consigliamo di <a href=\"https:\/\/www.mongodb.com\/docs\/mongodb-shell\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">installare la shell MongoDB a riga di comando<\/a>.<\/p>\n<p><a href=\"https:\/\/www.adminer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Adminer<\/a> \u00e8 un client per database basato sul web che supporta MongoDB, anche se al momento \u00e8 limitato all&#8217;ispezione delle raccolte. Adminer \u00e8 scaricabile come singolo script PHP, ma \u00e8 gi\u00e0 configurato se utilizzate l&#8217;<a href=\"https:\/\/docs.google.com\/document\/d\/13hLswY74cFDedN7DoUWbIshf6K7wRI4myCvKcpvNIZ0\/edit#heading=h.jv0yfv8fhy7q\" target=\"_blank\" rel=\"noopener noreferrer\">installazione Docker<\/a> o avete <a href=\"https:\/\/kinsta.com\/docs\/devkinsta\/database-manager\/\">installato DevKinsta<\/a>.<\/p>\n<p>Un&#8217;applicazione client con interfaccia grafica offre un&#8217;interfaccia migliore per aggiornare e ispezionare i dati. Ci sono diverse opzioni disponibili, tra cui <a href=\"https:\/\/www.mongodb.com\/products\/compass\" target=\"_blank\" rel=\"noopener noreferrer\">MongoDB Compass<\/a>, gratuito e multipiattaforma:<\/p>\n<figure id=\"attachment_123493\" aria-describedby=\"caption-attachment-123493\" style=\"width: 1315px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-123493\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/05\/compass.png\" alt=\"MongoDB Compass\" width=\"1315\" height=\"932\"><figcaption id=\"caption-attachment-123493\" class=\"wp-caption-text\">MongoDB Compass<\/figcaption><\/figure>\n<p><a href=\"https:\/\/studio3t.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Studio 3T<\/a>, un altro concorrente della GUI, offre un&#8217;applicazione commerciale che garantisce funzionalit\u00e0 limitate gratuitamente:<\/p>\n<figure id=\"attachment_123492\" aria-describedby=\"caption-attachment-123492\" style=\"width: 1266px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-123492\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/05\/studio3t.png\" alt=\"Studio 3T\" width=\"1266\" height=\"905\"><figcaption id=\"caption-attachment-123492\" class=\"wp-caption-text\">Studio 3T<\/figcaption><\/figure>\n<p>Si pu\u00f2 accedere al proprio database MongoDB utilizzando uno qualsiasi tra i seguenti strumenti:<\/p>\n<ol>\n<li>Il nome di rete della macchina, l&#8217;URL o l&#8217;indirizzo IP (<strong>localhost <\/strong>per un&#8217;installazione locale).<\/li>\n<li>La porta di MongoDB (<strong>27017 <\/strong>per impostazione predefinita).<\/li>\n<li>Un <strong>ID <\/strong>utente e una <strong>password<\/strong>. Di solito viene definito un utente root durante l&#8217;installazione.<\/li>\n<\/ol>\n<h3>2. Impostare e Salvare le Credenziali di Accesso al Database<\/h3>\n<p>L&#8217;amministratore root ha accesso illimitato a tutti i database. In generale, dovreste utilizzare un utente personalizzato con privilegi specifici per limitare l&#8217;accesso e <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-e-sicurezza\/\">aumentare la sicurezza<\/a>.<\/p>\n<p>Ad esempio, il seguente comando crea un utente chiamato <strong>myuser <\/strong>con la password <strong>mypass <\/strong>che ha accesso in lettura e scrittura al database <strong>mydb<\/strong>:<\/p>\n<pre><code class=\"language-bash\">use mydb;\n\ndb.createUser({\n  user: \"myuser\",\n  pwd: \"mypass\",\n  roles: [\n    { role: \"readWrite\", db: \"mydb\" }\n  ]\n});<\/code><\/pre>\n<h2>Come Inserire Nuovi Documenti in MongoDB<\/h2>\n<p>Non \u00e8 necessario definire un database o una raccolta prima di inserire il primo documento. Utilizzando un qualsiasi client MongoDB, basta passare a un database chiamato mongodemo:<\/p>\n<pre><code class=\"language-bash\">use mongodemo;<\/code><\/pre>\n<p>Quindi inserite un singolo documento in una nuova raccolta di persone:<\/p>\n<pre><code class=\"language-bash\">db.person.insertOne(\n  {\n    name: 'Abdul',\n    company: 'Alpha Inc',\n    telephone: [\n      { home: '0123456789' },\n      { work: '9876543210' }\n    ]\n  }\n);<\/code><\/pre>\n<p>Visualizzate il documento eseguendo una query che restituisca tutti i risultati della raccolta di persone:<\/p>\n<pre><code class=\"language-bash\">db.person.find({});<\/code><\/pre>\n<p>Il risultato sar\u00e0 simile a questo:<\/p>\n<pre><code class=\"language-bash\">{\n  \"_id\" : ObjectId(\"62442429854636a03f6b8534\"),\n  name: 'Abdul',\n  company: 'Alpha Inc',\n  telephone: [\n    { home: '0123456789' },\n    { work: '9876543210' }\n  ]\n}<\/code><\/pre>\n<h3>Come Inserire pi\u00f9 Documenti<\/h3>\n<p>Potete inserire pi\u00f9 documenti in una raccolta passando un array a <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.collection.insertMany\/\" target=\"_blank\" rel=\"noopener noreferrer\">insertMany()<\/a>. Il codice seguente crea altri documenti di persone e una nuova raccolta azienda:<\/p>\n<pre><code class=\"language-bash\">db.person.insertMany([\n  {\n    name: 'Brian',\n    company: 'Beta Inc'\n  },\n  {\n    name: 'Claire',\n    company: 'Gamma Inc',\n    telephone: [\n      { cell: '3141592654' }\n    ]\n  },\n  {\n    name: 'Dawn',\n    company: 'Alpha Inc'\n  },\n  {\n    name: 'Esther',\n    company: 'Beta Inc',\n    telephone: [\n      { home: '001122334455' }\n    ]\n  },\n  {\n    name: 'George',\n    company: 'Gamma Inc'\n  },\n  {\n    name: 'Henry',\n    company: 'Alpha Inc',\n    telephone: [\n      { work: '012301230123' },\n      { cell: '161803398875' }\n    ]\n  },\n]);\n\ndb.company.insertMany([\n  {\n    name: 'Alpha Inc',\n    base: 'US'\n  },\n  {\n    name: 'Beta Inc',\n    base: 'US'\n  },\n  {\n    name: 'Gamma Inc',\n    base: 'GB'\n  },\n]);<\/code><\/pre>\n<h3>Da Dove Viene l&#8217;_id?<\/h3>\n<p>MongoDB assegna automaticamente un _id a ogni documento di una raccolta. Si tratta di un ObjectID, un valore BSON (Binary Javascript Object Notation) contenente:<\/p>\n<ul>\n<li>L&#8217;epoch Unix in secondi al momento della creazione (4 byte)<\/li>\n<li>Un ID macchina\/processo a 5 byte<\/li>\n<li>Un contatore a 3 byte che inizia con un valore casuale<\/li>\n<\/ul>\n<p>Questa \u00e8 la chiave primaria del documento. Il valore esadecimale di 24 caratteri \u00e8 garantito come unico per tutti i documenti del database e non pu\u00f2 essere modificato una volta inserito.<\/p>\n<p>MongoDB fornisce anche una <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/ObjectId.getTimestamp\/\" target=\"_blank\" rel=\"noopener noreferrer\">funzione getTimeStamp()<\/a> che permette di ottenere la data\/ora di creazione del documento senza dover impostare esplicitamente un valore. In alternativa, si pu\u00f2 definire il valore _id univoco quando viene creato un documento.<\/p>\n<h3>Denormalizzazione dei Dati<\/h3>\n<p>I record inseriti in precedenza impostano l&#8217;azienda di ogni utente come una stringa come &#8220;Alpha Inc&#8221;. Questo non \u00e8 consigliato nei database SQL normalizzati:<\/p>\n<ul>\n<li>\u00c8 facile commettere un errore: un utente \u00e8 assegnato ad &#8220;Alpha Inc&#8221; mentre un altro \u00e8 &#8220;Alpha Inc.&#8221; (carattere di punto aggiuntivo). Vengono trattati come aziende diverse.<\/li>\n<li>Aggiornare il nome di un&#8217;azienda potrebbe significare aggiornare molti record.<\/li>\n<\/ul>\n<p>La soluzione SQL consiste nel creare una tabella di <em>aziende<\/em> e associare un&#8217;azienda a una persona utilizzando la sua chiave primaria (probabilmente un numero intero). La chiave rimarr\u00e0 la stessa indipendentemente dai cambiamenti del nome dell&#8217;azienda e il database potr\u00e0 applicare delle regole per garantire l&#8217;integrit\u00e0 dei dati.<\/p>\n<p>La denormalizzazione \u00e8 incoraggiata in MongoDB. I dati devono essere ripetuti attivamente e un singolo documento pu\u00f2 contenere tutte le informazioni necessarie. Questo comporta diversi vantaggi:<\/p>\n<ul>\n<li>I documenti sono autonomi e pi\u00f9 facili da leggere: non c&#8217;\u00e8 bisogno di fare riferimento ad altre raccolte.<\/li>\n<li>Le prestazioni in scrittura possono essere pi\u00f9 veloci rispetto a un database SQL perch\u00e9 vengono applicate meno regole di integrit\u00e0 dei dati.<\/li>\n<li>Lo sharding, ovvero la distribuzione dei dati su pi\u00f9 macchine, diventa pi\u00f9 semplice perch\u00e9 non \u00e8 necessario fare riferimento ai dati di altre raccolte.<\/li>\n<\/ul>\n<h2>Query Semplici su MongoDB<\/h2>\n<p>Si possono elencare tutti i documenti di una raccolta, come ad esempio una persona, utilizzando una find() vuota:<\/p>\n<pre><code class=\"language-bash\">db.person.find({})<\/code><\/pre>\n<p>Il <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/command\/count\/\">metodo count()<\/a> restituisce il numero di documenti (nel nostro caso, questo numero sar\u00e0 7):<\/p>\n<pre><code class=\"language-bash\">db.person.find({}).count();<\/code><\/pre>\n<p>Il <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/update\/sort\/\">metodo sort()<\/a> restituisce i documenti nell&#8217;ordine che preferite, ad esempio per nome in ordine alfabetico inverso:<\/p>\n<pre><code class=\"language-bash\">db.person.find({}).sort({ name: -1 });<\/code><\/pre>\n<p>Si possono anche limitare il numero di documenti restituiti, ad esempio trovare i primi tre nomi:<\/p>\n<pre><code class=\"language-bash\">db.person.find({}).sort({ name: 1 }).limit(2);<\/code><\/pre>\n<p>\u00c8 possibile cercare record specifici definendo una query con uno o pi\u00f9 campi, ad esempio trovare tutti i documenti di persone il cui nome \u00e8 impostato su &#8220;Claire&#8221;:<\/p>\n<pre><code class=\"language-bash\">db.person.find({ name: 'Claire' });<\/code><\/pre>\n<p>Sono supportati anche gli <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/\">operatori logici<\/a> come $e, $o, $non, $gt (maggiore di), $lt (minore di) e $ne (non uguale), ad esempio per individuare tutti i documenti di persone in cui l&#8217;azienda \u00e8 &#8220;Alpha Inc&#8221; o &#8220;Beta Inc&#8221;:<\/p>\n<pre><code class=\"language-bash\">db.person.find({\n  $or: [\n    { company: 'Alpha Inc' },\n    { company: 'Beta Inc' }\n  ]\n});<\/code><\/pre>\n<p>Nel database di esempio, lo stesso risultato potrebbe essere ottenuto con $nin (not in) per estrarre tutti i documenti in cui l&#8217;azienda <strong>non <\/strong>\u00e8 &#8220;Gamma Inc&#8221;:<\/p>\n<pre><code class=\"language-bash\">db.person.find({\n  company: { $nin: ['Gamma Inc'] }\n});<\/code><\/pre>\n<p>Un secondo oggetto valore nel metodo find() imposta una <em>proiezione<\/em> che definisce i campi restituiti. In questo esempio, viene restituito solo il nome (nota che l&#8217;_id del documento viene sempre restituito a meno che non sia esplicitamente disattivato):<\/p>\n<pre><code class=\"language-bash\">db.person.find(\n  { name:'Claire' },\n  { _id:0, name:1 }\n);<\/code><\/pre>\n<p>Il risultato:<\/p>\n<pre><code class=\"language-bash\">{\n  \"name\" : \"Claire\"\n}<\/code><\/pre>\n<p>La <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/elemMatch\/\" target=\"_blank\" rel=\"noopener noreferrer\"> query $elemMatch<\/a> permette di trovare elementi in un array, ad esempio tutti i documenti in cui l&#8217;array del telefono ha un numero di lavoro. Lo stesso $elemMatch pu\u00f2 essere utilizzato nella proiezione per mostrare solo il numero di lavoro:<\/p>\n<pre><code class=\"language-bash\">db.person.find(\n  {\n    telephone: { $elemMatch: { work: { $exists: true }} }\n  },\n  {\n    _id: 0,\n    name:1,\n    telephone: { $elemMatch: { work: { $exists: true }}}\n  }\n);<\/code><\/pre>\n<p>Il risultato:<\/p>\n<pre><code class=\"language-bash\">{\n  \"name\" : \"Abdul\",\n  \"telephone\" : [\n    { \"work\" : \"9876543210\" }\n  ]\n},\n{\n  \"name\" : \"Henry\",\n  \"telephone\" : [\n    { \"work\" : \"012301230123\" }\n  ]\n}<\/code><\/pre>\n<h2>Usare i Cursori in MongoDB<\/h2>\n<p>La maggior parte dei driver di database consente di restituire i risultati di una query come un array o una struttura di dati simile. Tuttavia, se l&#8217;insieme contiene migliaia di documenti, questo potrebbe comportare problemi di memoria.<\/p>\n<p>Come la maggior parte dei database SQL, MongoDB supporta il concetto di <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/js-cursor\/\" target=\"_blank\" rel=\"noopener noreferrer\">cursore<\/a>. I cursori permettono a un&#8217;applicazione di leggere i risultati di una query uno alla volta prima di passare all&#8217;elemento successivo o di abbandonare la ricerca.<\/p>\n<p>I cursori possono essere utilizzati anche da una shell di MongoDB:<\/p>\n<pre><code class=\"language-bash\">let myCursor = db.person.find( {} );\n\nwhile ( myCursor.hasNext() ) {\n  print(tojson( myCursor.next() ));\n}<\/code><\/pre>\n<h2>Come Creare Indici in MongoDB<\/h2>\n<p>La raccolta di persone contiene attualmente sette documenti, per cui qualsiasi query non sar\u00e0 costosa dal punto di vista computazionale. Tuttavia, immaginate di avere un milione di contatti con nome e indirizzo e-mail. I contatti possono essere ordinati per nome, ma gli indirizzi e-mail saranno in un ordine apparentemente casuale.<\/p>\n<p>Se si vuole cercare un contatto in base alla sua email, il database dovr\u00e0 cercare fino a un milione di elementi prima di trovare una corrispondenza. L&#8217;aggiunta di un indice sul campo email crea una &#8220;tabella&#8221; di ricerca in cui le email sono memorizzate in ordine alfabetico. Il database pu\u00f2 ora utilizzare algoritmi di ricerca pi\u00f9 efficienti per individuare la persona corretta.<\/p>\n<p>Gli indici diventano essenziali quando il numero di documenti aumenta. In generale, dovreste applicare un indice a tutti i campi che potrebbero essere citati in una query. <em>Potreste<\/em> applicare indici a tutti i campi, ma sappiate che questo rallenterebbe gli aggiornamenti dei dati e aumenterebbe lo spazio su disco necessario per la reindicizzazione.<\/p>\n<p>MongoDB offre una serie di tipi di indici.<\/p>\n<h3>Indici a Campo Singolo<\/h3>\n<p>La maggior parte degli indici viene applicata a singoli campi, ad esempio indicizzando il campo nome in ordine alfabetico crescente:<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex({ name: 1 });<\/code><\/pre>\n<p>L&#8217;utilizzo di -1 inverte l&#8217;ordine. Questo sarebbe poco utile nel nostro esempio, ma potrebbe essere utile nel caso in cui aveste un campo &#8220;data&#8221; in cui gli eventi pi\u00f9 recenti hanno la priorit\u00e0.<\/p>\n<p>Altri tre indici sono utili nel database di esempio di mongodemo:<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex( { company: 1 } );\ndb.company.createIndex( { name: 1 } );\ndb.company.createIndex( { base: 1 } );<\/code><\/pre>\n<h3>Indici Composti su pi\u00f9 Campi<\/h3>\n<p>Due o pi\u00f9 campi possono essere specificati in un indice, ad esempio<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex( { name: 1, company: 1 } );<\/code><\/pre>\n<p>Questo pu\u00f2 essere utile quando un campo viene regolarmente utilizzato insieme a un altro nelle query di ricerca.<\/p>\n<h3>Indici a pi\u00f9 Chiavi su Elementi di Array o di Oggetti<\/h3>\n<p>I documenti possono essere complessi e spesso \u00e8 necessario indicizzare i campi pi\u00f9 profondi della struttura, come ad esempio il numero di telefono del lavoro:<\/p>\n<pre><code class=\"language-bash\">db.products.createIndex( { 'telephone.work': 1 } );<\/code><\/pre>\n<h3>Indici Jolly<\/h3>\n<p>Un indice jolly pu\u00f2 indicizzare tutti i campi di un documento. Questo \u00e8 generalmente pratico per i documenti pi\u00f9 piccoli e semplici che possono essere interrogati in vari modi:<\/p>\n<pre><code class=\"language-bash\">db.company.createIndex( { '$**': 1 } );<\/code><\/pre>\n<h3>Indici Full-text<\/h3>\n<p>Un indice di testo permette di creare query simili a quelle di un motore di ricerca che possono esaminare il testo in tutti i campi delle stringhe e ordinarlo in base alla rilevanza. \u00c8 possibile limitare l&#8217;indice di testo a campi specifici:<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex( { name: \"text\", company: \"text\" } );<\/code><\/pre>\n<p>&#8230; oppure creare un indice di testo su tutti i campi stringa:<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex( { \"$**\": \"text\" } );<\/code><\/pre>\n<p>L&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/text-search\/\" target=\"_blank\" rel=\"noopener noreferrer\">operatore $text<\/a> permette di effettuare ricerche in questo indice, ad esempio per trovare tutti i documenti in cui si fa riferimento a &#8220;Gamma&#8221;:<\/p>\n<pre><code class=\"language-bash\">db.person.find({ $text: { $search: 'Gamma' } });<\/code><\/pre>\n<p>\u00c8 bene notare che le ricerche full text richiedono generalmente cinque o pi\u00f9 caratteri per restituire risultati utili.<\/p>\n<h3>Altri Tipi di Indice<\/h3>\n<p>MongoDB offre diversi altri tipi di indici specializzati:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/core\/index-hashed\/\" target=\"_blank\" rel=\"noopener noreferrer\">indice hashed<\/a><\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/core\/2dsphere\/\" target=\"_blank\" rel=\"noopener noreferrer\">indice 2d<\/a> &#8211; punti su un piano bidimensionale<\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/core\/2d\/\" target=\"_blank\" rel=\"noopener noreferrer\">indice 2dsphere<\/a> &#8211; geometrie su una sfera simile alla Terra<\/li>\n<\/ul>\n<h2>Come Gestire gli Indici di MongoDB<\/h2>\n<p>Gli indici definiti su una raccolta possono essere esaminati con:<\/p>\n<pre><code class=\"language-bash\">db.person.getIndexes();<\/code><\/pre>\n<p>Questo restituisce un array di risultati come:<\/p>\n<pre><code class=\"language-bash\">[\n  {\n    \"v\" : 2.0,\n    \"key\" : { \"_id\" : 1.0 },\n    \"name\" : \"_id_\"\n  },\n  {\n    \"v\" : 2.0,\n    \"key\" : { \"company\" : 1.0 },\n    \"name\" : \"company_1\"\n  },\n  {\n    \"v\" : 2.0,\n    \"key\" : { \"name\" : 1.0 },\n    \"name\" : \"name_1\"\n  }\n]<\/code><\/pre>\n<p>La &#8220;chiave&#8221; definisce il campo e l&#8217;ordine, mentre il &#8220;nome&#8221; \u00e8 un identificatore unico per quell&#8217;indice, come ad esempio &#8220;azienda_1&#8221; per l&#8217;indice del campo azienda.<\/p>\n<p>L&#8217;efficacia di un indice pu\u00f2 essere esaminata aggiungendo un <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.collection.explain\/\" target=\"_blank\" rel=\"noopener noreferrer\"> metodo .explain()<\/a> a qualsiasi query, ad esempio<\/p>\n<pre><code class=\"language-bash\">db.person.find({ name:'Claire' }).explain();<\/code><\/pre>\n<p>Questo metodo restituisce un&#8217;ampia serie di dati, ma l&#8217;oggetto &#8220;winningPlan&#8221; mostra l'&#8221;indexName&#8221; utilizzato nella query:<\/p>\n<pre><code class=\"language-bash\">\"winningPlan\" : {\n  \"stage\" : \"FETCH\",\n  \"inputStage\" : {\n    \"stage\" : \"IXSCAN\",\n    \"keyPattern\" : { \"name\" : 1.0 },\n    \"indexName\" : \"name_1\",\n  }\n}<\/code><\/pre>\n<p>Se necessario, si pu\u00f2 eliminare un indice facendo riferimento al suo nome:<\/p>\n<pre><code class=\"language-bash\">db.person.dropIndex( 'name_1' );<\/code><\/pre>\n<p>o utilizzando il documento di specifica dell&#8217;indice:<\/p>\n<pre><code class=\"language-bash\">db.person.dropIndex({ name: 1 });<\/code><\/pre>\n<p>Il <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.collection.dropIndexes\/\" target=\"_blank\" rel=\"noopener noreferrer\">metodo dropIndexes()<\/a> permette di eliminare pi\u00f9 di un indice con un unico comando.<\/p>\n<h2>Usare gli Schemi di Convalida dei Dati di MongoDB<\/h2>\n<p>A differenza di SQL, gli schemi di definizione dei dati non sono necessari in MongoDB. \u00c8 possibile inviare qualsiasi dato a qualsiasi documento di qualsiasi raccolta in qualsiasi momento.<\/p>\n<p>Questo offre una notevole libert\u00e0. Tuttavia, pu\u00f2 capitare che si voglia insistere sul rispetto delle regole. Ad esempio, non dovrebbe essere possibile inserire un documento nella raccolta di persone se non contiene un nome.<\/p>\n<p>Le regole di validazione possono essere specificate utilizzando un <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/jsonSchema\/\" target=\"_blank\" rel=\"noopener noreferrer\"> oggetto $jsonSchema<\/a> che definisce un array di elementi obbligatori e le propriet\u00e0 di ogni campo validato. La raccolta di persone \u00e8 gi\u00e0 stata creata, ma si pu\u00f2 comunque definire uno schema che specifichi che \u00e8 richiesta una stringa di nome:<\/p>\n<pre><code class=\"language-bash\">db.runCommand({\n  collMod: 'person',\n  validator: {\n    $jsonSchema: {\n      required: [ 'name' ],\n      properties: {\n        name: {\n          bsonType: 'string',\n          description: 'name string required'\n        }\n      }\n    }\n  }\n});<\/code><\/pre>\n<p>Provate a inserire un documento persona senza nome:<\/p>\n<pre><code class=\"language-bash\">db.person.insertOne({ company: 'Alpha Inc' });<\/code><\/pre>\n<p>&#8230; e il comando fallir\u00e0:<\/p>\n<pre><code class=\"language-bash\">{\n  \"index\" : 0.0,\n  \"code\" : 121.0,\n  \"errmsg\" : \"Document failed validation\",\n  \"op\" : {\n      \"_id\" : ObjectId(\"624591771658cd08f8290401\"),\n      \"company\" : \"Alpha Inc\"\n  }\n}<\/code><\/pre>\n<p>Gli schemi possono essere definiti anche se <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.createCollection\/\" target=\"_blank\" rel=\"noopener noreferrer\">create una raccolta<\/a> prima che venga utilizzata. Il seguente comando implementa le stesse regole di cui sopra:<\/p>\n<pre><code class=\"language-bash\">db.createCollection('person', {\n  validator: {\n    $jsonSchema: {\n        required: [ 'name' ],\n        properties: {\n          name: {\n          bsonType: 'string',\n          description: 'name string required'\n          }\n      }\n    }\n  }\n});<\/code><\/pre>\n<p>Questo esempio pi\u00f9 complesso crea una raccolta di utenti che convalida il nome, l&#8217;indirizzo e-mail e almeno un numero di telefono:<\/p>\n<pre><code class=\"language-bash\">db.createCollection('users', {\n  validator: {\n    $jsonSchema: {\n      required: [ 'name', 'email', 'telephone' ],\n      properties: {\n        name: {\n          bsonType: 'string',\n          description: 'name string required'\n          },\n          email: {\n        bsonType: 'string',\n          pattern: '^.+@.+$',\n          description: 'valid email required'\n          },\n        telephone: {\n          bsonType: 'array',\n          minItems: 1,\n          description: 'at least one telephone number required'\n          }\n      }\n    }\n  }\n});<\/code><\/pre>\n<h2>Come Aggiornare i Documenti Esistenti in MongoDB<\/h2>\n<p>MongoDB offre diversi <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/update-methods\/\" target=\"_blank\" rel=\"noopener noreferrer\">metodi di aggiornamento<\/a>, tra cui <code>updateOne()<\/code>, <code>updateMany()<\/code> e <code>replaceOne()<\/code>. Questi vengono passati:<\/p>\n<ul>\n<li>Un oggetto filtro che individua i documenti da aggiornare<\/li>\n<li>Un oggetto update &#8211; o un array di oggetti update &#8211; che descrive i dati da modificare<\/li>\n<li>Un oggetto opzionale Opzioni. La propriet\u00e0 pi\u00f9 utile \u00e8 upsert che permette di inserire un nuovo documento se non ne viene trovato nessuno.<\/li>\n<\/ul>\n<p>L&#8217;esempio seguente aggiorna il documento persona il cui nome \u00e8 impostato su &#8220;Henry&#8221;. Rimuove il numero di telefono del lavoro, aggiunge un numero di telefono di casa e imposta una nuova data di nascita:<\/p>\n<pre><code class=\"language-bash\">db.person.updateOne(\n  { name: 'Henry' },\n  [\n    { $unset: [ 'telephone.work' ] },\n    { $set: {\n      'birthdate': new ISODate('1980-01-01'),\n      'telephone': [ { 'home': '789789789' } ]\n    } }\n  ]\n);<\/code><\/pre>\n<p>Il prossimo esempio aggiorna il documento della persona il cui nome \u00e8 impostato su &#8220;Ian&#8221;. Questo nome non esiste attualmente, ma impostando upsert su &#8220;true&#8221; lo si crea:<\/p>\n<pre><code class=\"language-bash\">db.person.updateOne(\n  { name: 'Ian' },\n  { $set: { company: 'Beta Inc' } },\n  { upsert: true }\n);<\/code><\/pre>\n<p>\u00c8 possibile eseguire comandi di query per esaminare gli aggiornamenti dei dati in qualsiasi momento.<\/p>\n<h2>Come Eliminare i Documenti in MongoDB<\/h2>\n<p>L&#8217;esempio di aggiornamento precedente ha utilizzato $unset per rimuovere il numero di telefono del lavoro dal documento con il nome &#8220;Henry&#8221;. Per rimuovere un intero documento, si pu\u00f2 utilizzare uno dei diversi <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/delete-methods\/\" target=\"_blank\" rel=\"noopener noreferrer\">metodi di cancellazione<\/a>, tra cui <code>deleteOne()<\/code>, <code>deleteMany()<\/code> e <code>remove()<\/code> (che possono eliminare uno o pi\u00f9 documenti).<\/p>\n<p>Il documento appena creato per Ian pu\u00f2 essere eliminato con un filtro appropriato:<\/p>\n<pre><code class=\"language-bash\">db.person.deleteOne({ name: 'Ian' });<\/code><\/pre>\n<h2>Usare le Operazioni di Aggregazione in MongoDB<\/h2>\n<p>L&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/aggregation\/\" target=\"_blank\" rel=\"noopener noreferrer\">aggregazione<\/a> \u00e8 un&#8217;operazione molto efficace ma pu\u00f2 essere difficile da comprendere. Definisce una serie &#8211; o <em>pipeline<\/em> &#8211; di operazioni in un array. Ogni fase di questa pipeline <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/meta\/aggregation-quick-reference\/\" target=\"_blank\" rel=\"noopener noreferrer\">esegue un&#8217;operazione<\/a> come filtrare, raggruppare, calcolare o modificare un insieme di documenti. Uno stage pu\u00f2 anche utilizzare un comportamento simile a una JOIN SQL con un&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/lookup\/\" target=\"_blank\" rel=\"noopener noreferrer\">operazione di $lookup<\/a>. I documenti risultanti vengono passati allo stadio successivo della pipeline per un&#8217;ulteriore elaborazione, se necessario.<\/p>\n<p>L&#8217;aggregazione \u00e8 meglio illustrata con un esempio. Costruiremo passo dopo passo una query che restituisca il nome, l&#8217;azienda e il numero di telefono (se disponibile) di chiunque lavori per un&#8217;organizzazione con sede negli Stati Uniti.<\/p>\n<p>La prima operazione esegue un $match per filtrare le aziende con sede negli Stati Uniti:<\/p>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } }\n]);<\/code><\/pre>\n<p>Questo restituisce:<\/p>\n<pre><code class=\"language-bash\">{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853b\"),\n  \"name\" : \"Alpha Inc\",\n  \"base\" : \"US\"\n}\n{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853c\"),\n  \"name\" : \"Beta Inc\",\n  \"base\" : \"US\"\n}<\/code><\/pre>\n<p>Possiamo quindi aggiungere un nuovo operatore di pipeline $lookup che abbina il nome dell&#8217;azienda (localField) all&#8217;azienda (foreignField) nella raccolta di persone (from). Il risultato sar\u00e0 aggiunto come array di dipendenti al documento di ogni azienda:<\/p>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } },\n  { $lookup: {\n      from: 'person',\n      localField: 'name',\n      foreignField: 'company',\n            as: 'employee'\n          }\n        }\n]);<\/code><\/pre>\n<p>Ecco il risultato:<\/p>\n<pre><code class=\"language-bash\">{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853b\"),\n  \"name\" : \"Alpha Inc\",\n  \"base\" : \"US\",\n  \"employee\" : [\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8534\"),\n      \"name\" : \"Abdul\",\n      \"company\" : \"Alpha Inc\",\n      \"telephone\" : [\n        { \"home\" : \"0123456789\" },\n        { \"work\" : \"9876543210\" }\n      ]\n    },\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8537\"),\n      \"name\" : \"Dawn\",\n      \"company\" : \"Alpha Inc\"\n    },\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b853a\"),\n      \"name\" : \"Henry\",\n      \"company\" : \"Alpha Inc\",\n      \"telephone\" : [\n        { \"home\" : \"789789789\" }\n      ],\n    }\n  ]\n}\n{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853c\"),\n  \"name\" : \"Beta Inc\",\n  \"base\" : \"US\",\n  \"employee\" : [\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8535\"),\n      \"name\" : \"Brian\",\n      \"company\" : \"Beta Inc\"\n    },\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8538\"),\n      \"name\" : \"Esther\",\n      \"company\" : \"Beta Inc\",\n      \"telephone\" : [\n       { \"home\" : \"001122334455\" }\n      ]\n    }\n  ]\n}<\/code><\/pre>\n<p>Un&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/project\/#mongodb-pipeline-pipe.-project\" target=\"_blank\" rel=\"noopener noreferrer\">operazione $project (proiezione)<\/a> pu\u00f2 ora rimuovere tutti gli array tranne quello dei dipendenti. Segue un&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/unwind\/#mongodb-pipeline-pipe.-unwind\" target=\"_blank\" rel=\"noopener noreferrer\">operazione $unwind<\/a> per distruggere l&#8217;array e ottenere i documenti dei dipendenti separati:<\/p>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } },\n  { $lookup: { from: 'person', localField: 'name', foreignField: 'company', as: 'employee' } },\n  { $project: { _id: 0, employee: 1 } },\n  { $unwind: '$employee' }\n]);<\/code><\/pre>\n<p>Il risultato:<\/p>\n<pre><code class=\"language-bash\">{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8534\"),\n    \"name\" : \"Abdul\",\n    \"company\" : \"Alpha Inc\",\n    \"telephone\" : [\n      { \"home\" : \"0123456789\" },\n      { \"work\" : \"9876543210\" }\n    ]\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8537\"),\n    \"name\" : \"Dawn\",\n    \"company\" : \"Alpha Inc\"\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b853a\"),\n    \"name\" : \"Henry\",\n    \"company\" : \"Alpha Inc\",\n    \"telephone\" : [\n      { \"home\" : \"789789789\" }\n    ]\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8535\"),\n    \"name\" : \"Brian\",\n    \"company\" : \"Beta Inc\"\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8538\"),\n    \"name\" : \"Esther\",\n    \"company\" : \"Beta Inc\",\n    \"telephone\" : [\n      { \"home\" : \"001122334455\" }\n    ]\n  }\n}<\/code><\/pre>\n<p>Infine, un&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/replaceRoot\/#mongodb-pipeline-pipe.-replaceRoot\" target=\"_blank\" rel=\"noopener noreferrer\">operazione $replaceRoot<\/a> viene utilizzata per formattare ogni documento in modo da restituire solo il nome della persona, l&#8217;azienda e il numero di telefono del lavoro. Segue poi un&#8217;operazione <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/sort\/#mongodb-pipeline-pipe.-sort\" target=\"_blank\" rel=\"noopener noreferrer\">$sort<\/a> per restituire i documenti in ordine crescente di nome. La query aggregata completa:<\/p>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } },\n  { $lookup: { from: 'person', localField: 'name', foreignField: 'company', as: 'employee' } },\n  { $project: { _id: 0, employee: 1 } },\n  { $unwind: '$employee' },\n  { $replaceRoot: {\n    newRoot: {\n      $mergeObjects: [ {\n        name: \"$employee.name\",\n        company: '$employee.company',\n        work: { $first: '$employee.telephone.work' }\n      }, \"$name\" ]\n   } } },\n  { $sort: { name: 1 } }\n]);<\/code><\/pre>\n<p>Il risultato:<\/p>\n<pre><code class=\"language-bash\">{\n  \"name\" : \"Abdul\",\n  \"company\" : \"Alpha Inc\",\n  \"work\" : \"9876543210\"\n}\n{\n  \"name\" : \"Brian\",\n  \"company\" : \"Beta Inc\",\n}\n{\n  \"name\" : \"Dawn\",\n  \"company\" : \"Alpha Inc\",\n}\n{\n  \"name\" : \"Esther\",\n  \"company\" : \"Beta Inc\"\n}\n{\n  \"name\" : \"Henry\",\n  \"company\" : \"Alpha Inc\"\n}<\/code><\/pre>\n<p>Ci sono altri modi per ottenere questo risultato, ma il punto chiave \u00e8 che MongoDB pu\u00f2 svolgere la maggior parte del lavoro. Raramente \u00e8 necessario leggere i documenti e manipolare i dati direttamente nel codice dell&#8217;applicazione.<\/p>\n<h2>Come Eseguire Operazioni di Massa con MongoDB<\/h2>\n<p>Per impostazione predefinita, MongoDB pu\u00f2 gestire 1.000 operazioni contemporanee. \u00c8 improbabile che questo sia un problema quando si utilizza MongoDB, ma le applicazioni possono raggiungere questo limite se effettuano una serie di manipolazioni di dati su singoli record. Le applicazioni Node.js sono particolarmente problematiche perch\u00e9 possono inviare rapidamente una serie di richieste asincrone senza dover aspettare che vengano completate.<\/p>\n<p>Per aggirare questo problema, MongoDB fornisce un&#8217;<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/js-bulk\/\" target=\"_blank\" rel=\"noopener noreferrer\">API per le operazioni di massa<\/a> che accetta un numero qualsiasi di aggiornamenti che possono essere eseguiti in ordine sparso.<\/p>\n<p>Ecco un esempio di pseudocodice in Node.js:<\/p>\n<pre><code class=\"language-bash\">\/\/ reference the mycollection collection\nconst bulk = db.collection('mycollection').initializeUnorderedBulkOp();\n\n\/\/ make any number of data changes\nbulk.insertOne(...);\nbulk.insertMany(...)\nbulk.updateOne(...);\nbulk.deleteOne(...);\n\/\/ etc...\n\nbulk.execute();<\/code><\/pre>\n<p>L&#8217;ultima istruzione emette un&#8217;unica richiesta a MongoDB, in modo da ridurre le possibilit\u00e0 di raggiungere il limite di 1.000 operazioni.<br \/>\n<\/p>\n<h2>Riepilogo<\/h2>\n<p>MongoDB offre un archivio flessibile per applicazioni come sistemi di gestione dei contenuti, rubriche e social network, dove le strutture di dati rigide sono troppo rigide e difficili da definire. La scrittura dei dati \u00e8 veloce e lo sharding su pi\u00f9 server diventa pi\u00f9 semplice.<\/p>\n<p>Scrivere applicazioni utilizzando un database MongoDB pu\u00f2 anche essere liberatorio. \u00c8 possibile memorizzare qualsiasi dato in qualsiasi documento, in qualsiasi raccolta e in qualsiasi momento, il che \u00e8 particolarmente pratico se si sta sviluppando un prototipo o un Minimum Viable Product utilizzando metodologie agili in cui i requisiti si evolvono nel tempo.<\/p>\n<p>Detto questo, le query complesse possono rappresentare una sfida, e i concetti di denormalizzazione sono difficili da accettare quando si sta migrando dal mondo SQL.<\/p>\n<p>MongoDB \u00e8 meno adatto alle applicazioni che hanno requisiti transazionali rigidi in cui l&#8217;integrit\u00e0 dei dati \u00e8 essenziale, come nel caso dei sistemi bancari, contabili e di controllo delle scorte. Questi hanno campi di dati identificabili che devono essere progettati prima di iniziare la codifica.<\/p>\n<p>Ci sono molti tipi di applicazioni che si collocano tra questi due estremi, quindi la scelta del database pi\u00f9 adatto diventa pi\u00f9 difficile. Fortunatamente, i database NoSQL, tra cui MongoDB, hanno iniziato ad adottare opzioni simili a SQL, tra cui JOIN e transazioni.<\/p>\n<p>Al contrario, i database SQL come MySQL e <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-postgresql\/\">PostgreSQL<\/a> offrono ora campi dati JSON simili a quelli NoSQL. Anche questi potrebbero meritare la vostra attenzione, ma come sempre la scelta finale spetta solo a voi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se siete curiosi di entrare nel mondo del database MongoDB, questo \u00e8 il tutorial che fa per voi. Scoprirete come installare il software, manipolare i dati &#8230;<\/p>\n","protected":false},"author":188,"featured_media":56616,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[10885,25897,26170,26048,25635],"topic":[26106,25883],"class_list":["post-56615","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-database","tag-mongodb","tag-nosql","tag-strumenti-di-gestione-del-database","tag-sviluppo","topic-adminer","topic-strumenti-di-sviluppo-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cos&#039;\u00e8 MongoDB? Tutto sul Popolare Database Open Source<\/title>\n<meta name=\"description\" content=\"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cos&#039;\u00e8 MongoDB? Tutto sul Popolare Database Open Source\" \/>\n<meta property=\"og:description\" content=\"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-27T07:04:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-01T19:46:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Craig Buckler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@craigbuckler\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Craig Buckler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\"},\"author\":{\"name\":\"Craig Buckler\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e\"},\"headline\":\"Cos&#8217;\u00e8 MongoDB? Tutto sul Popolare Database Open Source\",\"datePublished\":\"2022-06-27T07:04:44+00:00\",\"dateModified\":\"2025-10-01T19:46:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\"},\"wordCount\":3965,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg\",\"keywords\":[\"database\",\"MongoDB\",\"NoSQL\",\"strumenti di gestione del database\",\"sviluppo\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\",\"name\":\"Cos'\u00e8 MongoDB? Tutto sul Popolare Database Open Source\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg\",\"datePublished\":\"2022-06-27T07:04:44+00:00\",\"dateModified\":\"2025-10-01T19:46:51+00:00\",\"description\":\"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Strumenti di Sviluppo Web\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/strumenti-di-sviluppo-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cos&#8217;\u00e8 MongoDB? Tutto sul Popolare Database Open Source\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e\",\"name\":\"Craig Buckler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"caption\":\"Craig Buckler\"},\"description\":\"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.\",\"sameAs\":[\"https:\/\/craigbuckler.com\/\",\"https:\/\/www.linkedin.com\/in\/craigbuckler\",\"https:\/\/x.com\/craigbuckler\",\"https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/craigbuckler\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cos'\u00e8 MongoDB? Tutto sul Popolare Database Open Source","description":"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/","og_locale":"it_IT","og_type":"article","og_title":"Cos'\u00e8 MongoDB? Tutto sul Popolare Database Open Source","og_description":"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.","og_url":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2022-06-27T07:04:44+00:00","article_modified_time":"2025-10-01T19:46:51+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg","type":"image\/jpeg"}],"author":"Craig Buckler","twitter_card":"summary_large_image","twitter_description":"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg","twitter_creator":"@craigbuckler","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Craig Buckler","Tempo di lettura stimato":"23 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/"},"author":{"name":"Craig Buckler","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e"},"headline":"Cos&#8217;\u00e8 MongoDB? Tutto sul Popolare Database Open Source","datePublished":"2022-06-27T07:04:44+00:00","dateModified":"2025-10-01T19:46:51+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/"},"wordCount":3965,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg","keywords":["database","MongoDB","NoSQL","strumenti di gestione del database","sviluppo"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/","url":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/","name":"Cos'\u00e8 MongoDB? Tutto sul Popolare Database Open Source","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg","datePublished":"2022-06-27T07:04:44+00:00","dateModified":"2025-10-01T19:46:51+00:00","description":"Le soluzioni di database open-source sono di gran moda. In questa guida esaminiamo MongoDB e ti aiutiamo a decidere se \u00e8 adatto ai tuoi progetti.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/06\/what-is-mongodb.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Strumenti di Sviluppo Web","item":"https:\/\/kinsta.com\/it\/argomenti\/strumenti-di-sviluppo-web\/"},{"@type":"ListItem","position":3,"name":"Cos&#8217;\u00e8 MongoDB? Tutto sul Popolare Database Open Source"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/715d986404b06691ab3014e06596908e","name":"Craig Buckler","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","caption":"Craig Buckler"},"description":"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.","sameAs":["https:\/\/craigbuckler.com\/","https:\/\/www.linkedin.com\/in\/craigbuckler","https:\/\/x.com\/craigbuckler","https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/craigbuckler\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/56615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=56615"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/56615\/revisions"}],"predecessor-version":[{"id":64245,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/56615\/revisions\/64245"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/translations\/es"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/56615\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/56616"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=56615"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=56615"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=56615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}