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" }