MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

4 modi per aggiornare un documento in MongoDB

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