MongoDB fornisce vari modi per aggiornare un documento. Il metodo che utilizzi dipenderà esattamente da come desideri eseguire l'aggiornamento.
Questo articolo presenta 4 modi per aggiornare un documento in MongoDB.
Il db.collection.updateOne()
Metodo
Il db.collection.updateOne()
metodo fa esattamente come promette il nome:aggiorna un documento.
Supponiamo di avere una collezione chiamata pets
che contiene i seguenti documenti:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Potremmo aggiornare un documento come questo:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Risultato:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Ciò ha aggiornato solo un documento, anche se due documenti corrispondono ai criteri di filtro (i criteri sono type: "Dog"
).
Possiamo controllare i risultati in questo modo:
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Il primo documento ora ha un type
di Cow
invece di Dog
, ma il secondo documento non ha subito modifiche, anche se soddisfaceva anche i criteri di filtro.
Il db.collection.updateMany()
Metodo
Il db.collection.updateMany()
il metodo aggiorna tutti i documenti che corrispondono al filtro specificato per una raccolta.
Usiamo i documenti di raccolta originali:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Ancora una volta, possiamo vedere che due documenti hanno Dog
come loro type
.
Possiamo aggiornare entrambi i documenti contemporaneamente in questo modo:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Risultato:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Questo ci mostra che due documenti corrispondono e due sono stati aggiornati.
Possiamo controllare la collezione:
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Il db.collection.update()
Metodo
Il db.collection.update()
il metodo può aggiornare un singolo documento o più documenti in una raccolta.
Per impostazione predefinita, aggiorna solo un singolo documento. Ma se multi: true
viene specificato, quindi aggiorna tutti i documenti che soddisfano i criteri di ricerca.
Aggiorna un singolo documento
Usiamo di nuovo la raccolta di documenti originale:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Potremmo aggiornare un documento come questo:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Risultato:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
È stato aggiornato un solo documento. Ciò viene confermato quando interroghiamo la raccolta.
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Aggiorna più documenti
Torniamo di nuovo alla raccolta di documenti originale:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
E ora aggiungeremo multi: true
alla nostra operazione di aggiornamento per aggiornare tutti i documenti che soddisfano i criteri di ricerca:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Risultato:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Quindi due documenti sono stati confrontati e aggiornati questa volta.
Diamo un'occhiata alla nostra collezione:
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Cow" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Come previsto, entrambi i documenti ora hanno un type
di Cow
.
Il db.collection.replaceOne()
Metodo
Il db.collection.replaceOne()
sostituisce un singolo documento all'interno della raccolta in base al filtro.
Sempre utilizzando la collezione originale:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vediamo cosa succede quando utilizziamo db.collection.replaceOne()
metodo contro di essa.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Risultato:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Un documento è stato aggiornato.
Diamo un'occhiata.
db.pets.find()
Risultato:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Questa volta, l'intero documento è stato sostituito con il nuovo documento (ad eccezione del _id
campo).
Questo metodo sostituisce l'intero documento (tranne per _id
campo).
Ribaltamento
Tutti i metodi precedenti accettano un upsert
argomento che consente di eseguire un'operazione di inserimento.
Quando upsert: true
, il documento viene aggiornato se c'è una corrispondenza con i criteri di ricerca, ma se non c'è corrispondenza, viene inserito un nuovo documento.
Esempio:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Risultato:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
In questo caso, non c'erano corrispondenze, quindi un documento è stato sostituito.
Controlliamo la collezione.
db.pets.find()
Risultato:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }