In MongoDB il db.collection.findOneAndReplace()
sostituisce un singolo documento in base al filtro specificato.
La collection
part è il nome della raccolta con cui eseguire l'operazione.
Esempio
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" }
Possiamo usare db.collection.findOneAndReplace()
metodo per sostituire uno di quei documenti.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Per impostazione predefinita, restituisce il documento originale (non la versione modificata).
Tieni presente che è stato aggiornato un solo cane, anche se nella raccolta sono presenti due cani.
Controlliamo la collezione.
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Possiamo vedere che il primo documento è stato sostituito con il nuovo documento.
Nota che il documento sostitutivo non può specificare un _id
valore che differisce da _id
valore nel documento sostituito.
Restituisci il documento modificato
Per impostazione predefinita, il documento originale viene restituito quando utilizzi db.collection.findOneAndReplace()
.
Se preferisci invece che venga restituito il documento modificato, utilizza returnNewDocument
parametro.
Facciamo un'altra modifica, ma questa volta useremo returnNewDocument: true
.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
{ returnNewDocument: true }
)
Risultato:
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
Questa volta l'altro cane è stato aggiornato. In questo caso, abbiamo apportato una modifica più significativa e possiamo vedere che il documento di reso riflette questo.
Possiamo controllare di nuovo la collezione per vedere il documento sostituito.
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Alzati
Un upsert è un'opzione che puoi utilizzare nelle operazioni di aggiornamento. Se il documento specificato non esiste, ne viene inserito uno nuovo. Se fa esiste, quindi il documento originale viene aggiornato (e nessun documento viene inserito).
Puoi eseguire upsert specificando upsert: true
.
Esempio usando upsert: false
Innanzitutto, ecco un esempio di tentativo di aggiornare un documento inesistente quando upsert: false
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
returnNewDocument: true
}
)
Risultato:
null
Il documento non esisteva nella raccolta e quindi findOneAndReplace()
restituito null
. Anche se non abbiamo specificato esplicitamente upsert: false
, sappiamo che era falso perché è il valore predefinito (ovvero è il valore utilizzato quando non specifichi un'opzione di inserimento).
Se diamo un'altra occhiata alla raccolta, possiamo vedere che il documento non è stato modificato.
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Esempio usando upsert: true
Ora eccolo di nuovo, ma questa volta specifichiamo upsert: true
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
upsert: true,
returnNewDocument: true
}
)
Risultato:
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Questa volta viene aggiornato un nuovo documento e vediamo il documento aggiornato come output (perché abbiamo specificato returnNewDocument: true
).
Controlliamo di nuovo la collezione.
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Quindi possiamo vedere che il nuovo documento è stato effettivamente capovolto.
Il sort
Parametro
Puoi usare il sort
parametro per specificare un ordinamento per i documenti corrispondenti al filter
.
Quando si utilizza sort
parametro, un valore di 1
ordina i documenti in ordine crescente e un valore di -1
li ordina in ordine decrescente.
L'argomento deve essere fornito come un documento. Ad esempio, { sort: { "salary": 1 } }
ordina per salary
campo in ordine crescente.
Ad esempio, supponiamo di creare una raccolta chiamata employees
con i seguenti documenti:
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Potremmo eseguire il codice seguente per trovare documenti con uno stipendio inferiore a 60000, quindi sostituire quello che è il più basso tra quei documenti.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
Risultato:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Questo mostra il documento prima che fosse aggiornato. Come previsto, il dipendente con lo stipendio più basso è stato sostituito con un nuovo stipendio (e un nuovo nome).
Ecco come sono ora i documenti.
db.employees.find()
Risultato:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fluffy", "salary" : 250000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Quindi possiamo vedere che Fritz è stato sostituito da Fluffy che ha uno stipendio molto migliore.
Riportiamolo al documento originale.
db.employees.remove({})
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Ora eseguiamo lo stesso findOneAndReplace()
codice di nuovo, ma questa volta lo ordineremo in ordine decrescente.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
Risultato:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Questa volta Sandy è stato sostituito.
Controlliamo di nuovo la collezione.
db.employees.find()
Risultato:
{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Come previsto.
Maggiori informazioni
Il db.collection.findOneAndReplace()
il metodo accetta anche altri parametri, come projection
(per specificare un sottoinsieme di campi da restituire), maxTimeMS
e collation
.
Consulta la documentazione di MongoDB per db.collections.findOneAndReplace()
per ulteriori informazioni.