MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB findOneAndReplace()

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Paginacja z MongoDB

  2. Najlepsza praktyka w utrzymywaniu sesji MGO

  3. Jak wykonać kopię zapasową bazy danych Open edX MongoDB

  4. Mongoose, znajdź, zwróć określone właściwości

  5. Usuń według _id w konsoli MongoDB