MongoDB è il database NoSQL a documenti più diffuso. La sua struttura gerarchica è:

Database
 └── Collection (equivalente di una tabella)
      └── Document (equivalente di una riga)
           └── Field (equivalente di una colonna)

Equivalenza concettuale:

SQL (Relazionale) MongoDB (NoSQL)
Database Database
Tabella Collection
Riga (tuple) Document (JSON/BSON)
Colonna Field
Primary Key _id (generato automaticamente)
JOIN $lookup o embedding
Schema fisso Schema flessibile

Struttura di un documento MongoDB

Ogni documento è un oggetto BSON (Binary JSON) con un campo _id univoco generato automaticamente:

{
  "_id": ObjectId("507f1f77bcf86cd799439011"),
  "nome": "Mario",
  "cognome": "Rossi",
  "email": "[email protected]",
  "data_nascita": "2005-03-15",
  "voti": [7, 8, 9, 6],
  "indirizzo": {
    "via": "Via Roma",
    "civico": "1",
    "città": "Milano",
    "CAP": "20100"
  },
  "corsi": ["Matematica", "Informatica", "Storia"]
}

Nota: i campi possono contenere array e oggetti annidati — questo sarebbe impossibile in una singola riga SQL senza tabelle separate.

Operazioni CRUD in MongoDB

// CREATE — inserire un documento
db.studenti.insertOne({
    nome: "Mario",
    cognome: "Rossi",
    voto_medio: 7.5
});

db.studenti.insertMany([
    { nome: "Luigi", cognome: "Bianchi" },
    { nome: "Anna",  cognome: "Verdi"   }
]);

// READ — trovare documenti
db.studenti.find();                           // tutti i documenti
db.studenti.find({ voto_medio: { $gt: 7 } }); // voto_medio > 7
db.studenti.findOne({ nome: "Mario" });       // primo risultato

// UPDATE — aggiornare
db.studenti.updateOne(
    { nome: "Mario" },              // filtro
    { $set: { voto_medio: 8.0 } }  // modifica
);

db.studenti.updateMany(
    { voto_medio: { $lt: 6 } },
    { $set: { stato: "insufficiente" } }
);

// DELETE — eliminare
db.studenti.deleteOne({ nome: "Mario" });
db.studenti.deleteMany({ voto_medio: { $lt: 5 } });

Operatori di query MongoDB:

Operatore SQL equivalente Esempio
$eq = { età: { $eq: 20 } }
$gt > { voto: { $gt: 6 } }
$gte >= { voto: { $gte: 6 } }
$lt < { voto: { $lt: 5 } }
$in IN { città: { $in: ["Roma", "Milano"] } }
$and AND { $and: [{età: {$gt:18}}, {voto:{$gt:6}}] }
$or OR { $or: [{nome:"Mario"}, {nome:"Luigi"}] }