W MongoDB db.collection.findOneAndReplace()
metoda zastępuje pojedynczy dokument na podstawie określonego filtra.
collection
część to nazwa kolekcji, na której ma zostać wykonana operacja.
Przykład
Załóżmy, że mamy kolekcję o nazwie pets
który zawiera następujące dokumenty:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Możemy użyć db.collection.findOneAndReplace()
metoda zastąpienia jednego z tych dokumentów.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Domyślnie zwraca oryginalny dokument (nie zmodyfikowaną wersję).
Zwróć uwagę, że tylko jeden pies został zaktualizowany, mimo że w kolekcji są dwa psy.
Sprawdźmy kolekcję.
db.pets.find()
Wynik:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Widzimy, że pierwszy dokument został zastąpiony nowym.
Zauważ, że dokument zastępczy nie może określać _id
wartość, która różni się od _id
wartość w zastępowanym dokumencie.
Zwróć zmodyfikowany dokument
Domyślnie oryginalny dokument jest zwracany po użyciu db.collection.findOneAndReplace()
.
Jeśli wolisz, aby zmodyfikowany dokument został zwrócony, użyj returnNewDocument
parametr.
Zróbmy kolejną modyfikację, ale tym razem użyjemy returnNewDocument: true
.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
{ returnNewDocument: true }
)
Wynik:
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
Tym razem drugi pies został zaktualizowany. W tym przypadku wprowadziliśmy bardziej znaczącą zmianę i widzimy, że dokument zwrotu to odzwierciedla.
Możemy ponownie sprawdzić kolekcję, aby zobaczyć zastąpiony dokument.
db.pets.find()
Wynik:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Przewrotki
Upsert to opcja, której można używać podczas operacji aktualizacji. Jeśli określony dokument nie istnieje, wstawiany jest nowy. Jeśli tak istnieje, wtedy oryginalny dokument jest aktualizowany (i żaden dokument nie jest wstawiany).
Możesz wykonać upsert, określając upsert: true
.
Przykład użycia upsert: false
Po pierwsze, oto przykład próby aktualizacji nieistniejącego dokumentu, gdy upsert: false
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
returnNewDocument: true
}
)
Wynik:
null
Dokument nie istniał w kolekcji, więc findOneAndReplace()
zwrócono null
. Mimo że nie określiliśmy wyraźnie upsert: false
, wiemy, że była to fałsz, ponieważ jest to wartość domyślna (tj. jest to wartość używana, gdy nie określisz opcji upsert).
Jeśli jeszcze raz przyjrzymy się kolekcji, zobaczymy, że dokument nie został przewrócony.
db.pets.find()
Wynik:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Przykład użycia upsert: true
Teraz znowu jest, ale tym razem określamy upsert: true
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
upsert: true,
returnNewDocument: true
}
)
Wynik:
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Tym razem nowy dokument jest zastępowany i widzimy zastępowany dokument jako wynik (ponieważ określiliśmy returnNewDocument: true
).
Sprawdźmy ponownie kolekcję.
db.pets.find()
Wynik:
{ "_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 }
Widzimy więc, że nowy dokument został w rzeczywistości zamieniony.
sort
Parametr
Możesz użyć sort
parametr określający kolejność sortowania dokumentów dopasowanych przez filter
.
Używając sort
parametr, wartość 1
sortuje dokumenty w porządku rosnącym, a wartość -1
sortuje je w porządku malejącym.
Argument należy przedstawić w formie dokumentu. Na przykład { sort: { "salary": 1 } }
sortuje według salary
pole w kolejności rosnącej.
Załóżmy na przykład, że tworzymy kolekcję o nazwie employees
z następującymi dokumentami:
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 }
])
Możemy uruchomić następujący kod, aby znaleźć dokumenty z pensją mniejszą niż 60000, a następnie zastąpić ten, który jest najniższy z tych dokumentów.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
Wynik:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Pokazuje dokument przed aktualizacją. Zgodnie z oczekiwaniami, pracownik z najniższą pensją został zastąpiony nową pensją (i nowym nazwiskiem).
Oto, jak teraz wyglądają dokumenty.
db.employees.find()
Wynik:
{ "_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 }
Widzimy więc, że Fritz został zastąpiony przez Fluffy'ego, który ma znacznie lepszą pensję.
Przywróćmy go z powrotem do oryginalnego dokumentu.
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 }
])
Teraz uruchommy tę samą findOneAndReplace()
kod ponownie, ale tym razem posortujemy go w kolejności malejącej.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
Wynik:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Tym razem Sandy został zastąpiony.
Sprawdźmy ponownie kolekcję.
db.employees.find()
Wynik:
{ "_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 }
Zgodnie z oczekiwaniami.
Więcej informacji
db.collection.findOneAndReplace()
metoda akceptuje również inne parametry, takie jak projection
(aby określić podzbiór pól do zwrócenia), maxTimeMS
i sort
.
Zobacz dokumentację MongoDB dla db.collections.findOneAndReplace()
aby uzyskać więcej informacji.