MongoDB
MongoDB è in database noSQL cioè non Relazionale. Le principali caratteristiche di MongoDB sono: - scalabilità
- è orientato ai documenti
- codifica json/bson
- schemaless
- poliformismo oggetti simili con attributi diversi
- auto-sharding Il db viene in bilanciato automaticamente su diversi server

Anche la terminologia usata è diversa per indicare che la struttura è diversa cerchiamo
comunque di fare una comparazione tra db relazionale e Mongodb.

RDBMS MONGODB
db db
table collection
row document
index index
Join Embedded Document
Foreign Key Reference

Come ogni altro database sono presenti le operazioni CRUD(create, read, update, delete) che qui alcune vengono definite con una propria denominazione per cui vediamo nella tabella sottostante un raffronto tra le diverse terminologie.
CRUD MONGODB
CREATE INSERT
READ FIND
UPDATE UPDATE
DELETE DELETE

MongoDB può essere utilizzato in Cloud oppure installato in locale. Qui faremo degli esempi in locale dalla CLI.
COMANDO MONGODB Descrizione
show dbs Lista dei databases
db database utilizzato
use name_db Seleziona db da usare
show collections lista collezioni in un database
db.nome_collection.find() senza parametri ritorna tutti i documenti della collection
db.nome_collection.find({"key":"value"}).pretty() cerca dati nella collection in base al parametro inserito - pretty per aspetto
db.nome_collection.findOne() la ricerca fornisce un solo risultato
db.nome_collection.insert() inserimento documento all'interno di una collection
db.nome_collection.update() update documenti
db.nome_collection.remove() delete i documenti selezionati
db.nome_collection.drop() delete intera collection
db.dropDatabase() delete db
Nella CLI digitare mongo per entrare nella console.
La console è una interfaccia Javascript per cui possiamo usare tutti gli strumenti di js come ad esempio definire delle var o delle function o inserire direttamente i comandi per operare nei database.
Nel riquadro sottostante procediamo ad indicare prima quale db usare con il comando use poi facciamo inserimento di dati in una collection. Da notare che non c'è bisogno di definire una nuova collection perchè mongo quando viene usato il metodo insert definisce la collection che poi può essere usata regolarmente. Dopo aver inserito diversi documenti all'interno della collection argomenti con il comando show vediamo quante collections sono presenti nel db e poi inseriamo un nuovo documento all'interno di una nuova collection e con il comando show ricontrolliamo quali collection sono all'interno del db e vediamo la variazione.
> use mecbar
switched to db mecbar
> db.argomenti.insert( { item: "quantum", settore: "algebra" } );
WriteResult({ "nInserted" : 1 })
> db.argomenti.insert( { item: "quantum", settore: "gate" } );
WriteResult({ "nInserted" : 1 })
> db.argomenti.insert( { item: "blockchain", settore: "ethereum" } );
WriteResult({ "nInserted" : 1 })
> db.argomenti.insert( { item: "blockchain", settore: "smart contract" } );
WriteResult({ "nInserted" : 1 })

> show collections
argomenti
>

> db.siti.insert( { nome: "mecbar", link: "www.mecbar.com" } );
WriteResult({ "nInserted" : 1 })
> show collections
argomenti
siti
Dopo avere popolato la collection con diversi documenti possiamo passare ad analizzare il comando per effettuare le ricerche prima senza parametri con find() che ci ritorna tutti i documenti e findOne() che ci ritorna un solo documento. Poi vediamo la ricerca con i parametri da notare che i parametri di ricerca vanno inseriti come un oggetto con le parentesi graffe.
> db.argomenti.find()
{ "_id" : ObjectId("5f3c362808f4769b4fc3aad9"), "item" : "quantum", "settore" : "algebra" }
{ "_id" : ObjectId("5f3c363208f4769b4fc3aada"), "item" : "quantum", "settore" : "gate" }
{ "_id" : ObjectId("5f3c367a08f4769b4fc3aadb"), "item" : "blockchain", "settore" : "ethereum" }
{ "_id" : ObjectId("5f3c36a908f4769b4fc3aadc"), "item" : "blockchain", "settore" : "smart contract" }
> db.argomenti.findOne()

{
"_id" : ObjectId("5f3c362808f4769b4fc3aad9"),
"item" : "quantum",
"settore" : "algebra"
}

> db.argomenti.find({settore:"ethereum"})
{ "_id" : ObjectId("5f3c367a08f4769b4fc3aadb"), "item" : "blockchain", "settore" : "ethereum" }
>

> db.argomenti.find({settore:"ethereum"}).pretty()

{
"_id" : ObjectId("5f3c367a08f4769b4fc3aadb"),
"item" : "blockchain",
"settore" : "ethereum"
}
Passiamo ora ad analizzare la procedura da seguire per eliminare un db da mongo. Prima selezionare il db con il comando db e poi fare il drop. Vediamo con il comando show che il db mecbarfoto non è più presente nella lista dei database.
> use mecbarfoto
switched to db mecbarfoto
> db.dropDatabase();
{ "dropped" : "mecbarfoto", "ok" : 1 }
>
> show dbs

admin 0.000GB
config 0.000GB
local 0.000GB
mecbar 0.000GB
newdb 0.000GB
Mongo usa il formato JSON per la rappresentazione dei dati mentre usa il BSON (bynary json) al suo interno per salvare i dati.
Per effettuare le ricerche mongo ci fornisce i seguenti parametri che ora andremo ad esaminare.
Query di Ricerca:
$gt $lt $or $and $in $nin $type $exists $regex
Query di Update:
$set $unset $inc
Query di Update su Array:
$push $pop $pull $pushAll(deprecato) $pullAll
$gt e $lt non considerano gli estremi per inserirli nella ricerca inserire la e di equal $gte e $lte Il primo esempio eseguiamo una ricerca per l'attributo age > 25
> db.users.find({ age: { $gt : 25 } }).pretty()
{
"_id" : ObjectId("5f3d4c7271fe14362210520d"),
"firstname" : "ugo",
"secondname" : "bianchi",
"city" : "turin",
"age" : 30
}
{
"_id" : ObjectId("5f3d4c9471fe14362210520e"),
"firstname" : "mario",
"secondname" : "verdi",
"city" : "venice",
"age" : 40
}
$gte
> db.users.find({ age: { $gte : 25 } }).pretty()
{
"_id" : ObjectId("5f3d4c7271fe14362210520d"),
"firstname" : "ugo",
"secondname" : "bianchi",
"city" : "turin",
"age" : 30
}
{
"_id" : ObjectId("5f3d4c9471fe14362210520e"),
"firstname" : "mario",
"secondname" : "verdi",
"city" : "venice",
"age" : 40
}
{
"_id" : ObjectId("5f3d4cb471fe14362210520f"),
"firstname" : "maria",
"secondname" : "rossi",
"city" : "rome",
"age" : 25
}

$gte e $lt Maggiore uguale e minore di
> db.users.find({ age: { $gte : 25, $lt : 30 } }).pretty()
{
"_id" : ObjectId("5f3d4cb471fe14362210520f"),
"firstname" : "maria",
"secondname" : "rossi",
"city" : "rome",
"age" : 25
}

Con le stringhe usa binary per cui ricerche non come attese

$exists per verificare se esiste componente
> db.users.find({ city : { $exists : true } } )

{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "secondname" : "rossi", "city" : "rome" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "secondname" : "verdi", "city" : "milan" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "secondname" : "bianchi", "city" : "turin" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "secondname" : "bianchi", "city" : "turin", "age" : 30 }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "secondname" : "verdi", "city" : "venice", "age" : 40 }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "secondname" : "rossi", "city" : "rome", "age" : 25 }
{ $exists : false } per estrarre tutti documenti che non hanno elemento indicato
> db.users.find({ age : { $exists : false } } )
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "secondname" : "rossi", "city" : "rome" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "secondname" : "verdi", "city" : "milan" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "secondname" : "bianchi", "city" : "turin" }
$type tipo di dato in bson vedere lista tipo in bsonspec.org stringa = 2
db.users.find( { firstname: { $type : 2 } } )
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "secondname" : "rossi", "city" : "rome" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "secondname" : "verdi", "city" : "milan" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "secondname" : "bianchi", "city" : "turin" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "secondname" : "bianchi", "city" : "turin", "age" : 30 }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "secondname" : "verdi", "city" : "venice", "age" : 40 }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "secondname" : "rossi", "city" : "rome", "age" : 25 }


$regex ricerca in base ad espressioni regolari quindi abbiamo tantissime combinazioni di ricerca
Qui effettuiamo la ricerca di tutti i firstname con lettere 'iu' all'interno
> db.users.find( { firstname: { $regex : "iu" } } )
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "secondname" : "bianchi", "city" : "turin" }
$regex con $ alla fine della stringa es. "a$" ricerca tutti i documenti che terminano con la stringa prima di $
> db.users.find( { firstname: { $regex : "a$" } } )
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "secondname" : "rossi", "city" : "rome", "age" : 25 }
UPDATEMANY usiamo questo parametro metodo di update per fare il rename di un elemento su tutta la collection con $rename
db.users.updateMany( { }, { $rename: { 'secondname': 'lastname' } } )
{ "acknowledged" : true, "matchedCount" : 6, "modifiedCount" : 6 }
$or Procediamo con i parametri di ricerca
> db.users.find( { $or : [ { lastname : { $regex : "o$" } } , { age : { $exists : false } } ] })
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "city" : "rome", "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
$and
> db.users.find( { $and : [ {firstname : { $regex : "o$" } } , { age : { $exists : false } } ] })
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "city" : "rome", "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
Il metodo sopra è uguale a quello sotto che viene privilegiato
> db.users.find( { firstname : "mario" , age : { $exists : false } })
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "city" : "rome", "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
La ricerca si adegua al polimorfismo per cui le ricerche sugli array vengono fatte come le altre perchè mongo si accorge che si è in presenza di un array ed effettua la ricerca su tutto l'array però si ferma al primo livello e non effettua una ricerca nidificata per motivi di performance.

$all
> db.users.find( { job : { $all :[ "architect" , "politician"] } } ).pretty()
{
"_id" : ObjectId("5f3d5abd71fe143622105210"),
"firstname" : "luigi",
"lastname" : "verdi",
"job" : [
"architect",
"politician"
]
}
$in
> db.users.find( { firstname : { $in :[ "mario" , "maria"] } } )
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "city" : "rome", "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 25, "lastname" : "rossi" }
$nin ovvero negazione di in
> db.users.find( { firstname : { $nin :[ "mario" , "maria"] } } )
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
Ricerca sotto-documenti
> db.users.find( { "job" : "politician" } )
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
next - limit - sort - skip Il risultato del find crea un oggetto cursore che ha 2 metodi :hasNext() e next()
Creiamo la variabile cursor ed applichiamo i 2 metodi
> var cursor = db.users.find( )
> cursor
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "city" : "rome", "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 25, "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }


cursor.hasNext() ritorna true se c'è un altro elemento su cui iterare

cursor.hasNext()
true


cursor.next() ritorna il valore della ricerca iterando sull'oggeto creato dalla ricerca

> cursor.next()
{
"_id" : ObjectId("5f3d4c1a71fe14362210520a"),
"firstname" : "mario",
"city" : "rome",
"lastname" : "rossi"
}

> cursor.next()
{
"_id" : ObjectId("5f3d4c2b71fe14362210520b"),
"firstname" : "mario",
"city" : "milan",
"lastname" : "verdi"
}
limit per limitare i risultati della ricerca
cursor.limit(2) prendo solo i primi 2 risultati
> var cursor = db.users.find( ).limit(2)
> cursor
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "firstname" : "mario", "city" : "rome", "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }


> var cursor = db.users.find().limit(5).sort({firstname: 1 , lastname: -1})
> cursor
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 25, "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }


> var cursor = db.users.find().limit(5).sort({firstname: -1 , lastname: 1}).skip(4)
> cursor
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 25, "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
non è importante ordine perchè mongo usa un suo ordine e precisamente :
prima sort poi limit ed infine skip


COUNT ci indica il numero delle occorrenze in base ai parametri di ricerca inseriti
> db.users.count( { firstname: "mario" } )
3
UPDATE

1 metodo - prima ricerca e poi inserisce quanto inserito nel secondo oggetto - solo quello inserito se non riportato tutto il contenuto si perdono dati
db.users.update({ firstname: "mario" }, { fistname:"mario", age:55 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find( )
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "fistname" : "mario", "age" : 55 }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 25, "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
2 metodo - con il $set modifichiamo il solo parametro inserito lasciando gli altri invariati
> db.users.update({ firstname: "giuseppe" }, { $set :{ city:"florence" } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find( )
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "fistname" : "mario", "age" : 55 }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "florence", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 25, "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
cerca firstname poi modifica city ma se non lo trova inserisce il contenuto del secondo oggetto quindi posso inserire anche ulteriori dati


$inc ci permette di incrementare valori numerici
db.users.update({ name: "bob" }, { $inc:{ age: 1 } }) se age non c'è lo inserisce con il valore incrementale in questo caso 1

> db.users.update({ firstname: "maria" }, { $inc:{ age: 1 } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ firstname: "maria" })
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "city" : "rome", "age" : 26, "lastname" : "rossi" }

$unset ci permette di eliminare un attributo :
> db.users.update({ firstname: "maria" }, { $unset:{ city: true } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find({ firstname: "maria" })
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "age" : 26, "lastname" : "rossi" }

ARRAY


inserire un array in una collection
> db.users.insert( {_id:0, a: [1,2,3,4,5]})
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "fistname" : "mario", "age" : 55 }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "firstname" : "mario", "city" : "milan", "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "florence", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "firstname" : "maria", "age" : 26, "lastname" : "rossi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
{ "_id" : 0, "a" : [ 1, 2, 3, 4, 5 ] }

Modificare un valore all'interno di un array - array a elemento alla quarta posizione
db.users.update( {_id:0 } , {$set : { "a.4" : 10 } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find({ "_id" : 0 })

{ "_id" : 0, "a" : [ 1, 2, 3, 4, 10 ] }
$push aggiungere nuovo elemento in un array
> db.users.update( {_id:0 } , {$push : { a : 11 } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 1, 2, 3, 4, 10, 11 ] }


> db.users.update( {_id:0 } , {$push : { a : [ 20,30, 40, 50 ] } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 2, 3, 4, [ 20, 30, 40, 50 ] ] }
$pull eliminare da array elemento indipendente dalla posizione ma in base al valore
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 1, 2, 3, 4, 10, 11 ] }

> db.users.update( {_id:0 } , {$pull: { "a" : 10 } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 1, 2, 3, 4, 11 ] }
$pop eliminare da array elemento in base a posizione - se mettiamo 1 elimina ultimo elemento se -1 elimina il primo
> db.users.update( {_id:0 } , {$pop : { a : 1} })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 1, 2, 3, 4 ] }

> db.users.update( {_id:0 } , {$pop : { a : -1} })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 2, 3, 4 ] }
$pullAll elimina tutti elementi dall'array in base al valore indicato
db.users.update( {_id:0 } , {$pullAll : { a: { [2,3 ] } })

> db.users.update( {_id:0 } , { $pullAll: { a: [2,3 ] } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ] ] }
$addToSet Insert dati in array solo se i dati indicati non sono presenti nell'array
db.users.update( {_id:0 } , {$addToSet : { a: { [20,30 40, 50] } })

> db.users.update( {_id:0 } , {$addToSet: { a: 20 } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ], 20 ] }

> db.users.update( {_id:0 } , { $addToSet: { a:[ 20,30] } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ], 20, [ 20, 30 ] ] }

> db.users.update( {_id:0 } , { $addToSet: { a:[ 20,30] } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.users.find({ "_id" : 0 })
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ], 20, [ 20, 30 ] ] }
UPSET modifica e se non presente prima lo crea vuoto e poi lo modifica
molto utile quando e come nella maggioranza dei casi se non si sa a priori se il docuemnto cercato esiste oppure no ...
> db.users.update( { lastname:"bianchi" } , { $set : { city: "turin" } }, { upset: true })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({ lastname : "bianchi" })
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "firstname" : "giuseppe", "city" : "turin", "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
opzione multi PER MODIFICARE PIU' DOCUMENTI
db.users.update( { country: {$exixts:true } } , {$set: { country : "italy" } } , { multi:true })

> db.users.update( { country: {$exists:true } } , {$set: { country : "italy" } } , { multi:true })
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

0 occurrenze

> db.users.find()
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "fistname" : "mario", "age" : 55 }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "country" : "france" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "country" : "france" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "country" : "france" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ], 20, [ 20, 30 ] ] }

> db.users.update( { country: {$exists:true } } , {$set: { country : "italy" } } , { multi:true })
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.users.find()
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "fistname" : "mario", "age" : 55 }
{ "_id" : ObjectId("5f3d4c2b71fe14362210520b"), "country" : "italy" }
{ "_id" : ObjectId("5f3d4c4271fe14362210520c"), "country" : "italy" }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d4cb471fe14362210520f"), "country" : "italy" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ], 20, [ 20, 30 ] ] }
ELIMINARE DOCUMENTI :

remove con il comando remove si elimina un documento alla volta per se tanti è lento
> db.users.remove( { country: "italy" } )
WriteResult({ "nRemoved" : 3 })

> db.users.find()
{ "_id" : ObjectId("5f3d4c1a71fe14362210520a"), "fistname" : "mario", "age" : 55 }
{ "_id" : ObjectId("5f3d4c7271fe14362210520d"), "firstname" : "ugo", "city" : "turin", "age" : 30, "lastname" : "bianchi" }
{ "_id" : ObjectId("5f3d4c9471fe14362210520e"), "firstname" : "mario", "city" : "venice", "age" : 40, "lastname" : "verdi" }
{ "_id" : ObjectId("5f3d5abd71fe143622105210"), "firstname" : "luigi", "lastname" : "verdi", "job" : [ "architect", "politician" ] }
{ "_id" : 0, "a" : [ 4, [ 20, 30, 40, 50 ], 20, [ 20, 30 ] ] }
drop elimina tutti i documenti della collection senza condizioni - molto veloce ma non si può scegliere cosa eliminare
> db.users.drop()
true
> db.users.find()