Aktualizacja danych dokumentów MongoDB za pomocą powłoki mongo

W tym rozdziale wprowadzimy aktualizację danych dokumentów MongoDB za pomocą powłoki mongo. MongoDB obsługuje różne sposoby aktualizacji wdrażane przez różne typy operatorów i obsługuje również wiele funkcji aktualizacji.

Przygotowanie danych testowych

Wstaw partię danych testowych do kolekcji inventory.

db.inventory.insertMany( [
   { item: "płótno", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "dziennik", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "podkładka pod mysz", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notes", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "papier", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "organizer", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "pocztówka", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "szkicownik", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "blok rysunkowy", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

Składnia operatora aktualizacji

Do aktualizacji dokumentów MongoDB zapewnia wiele operatorów aktualizacji (np. $set) do modyfikacji wartości pól.

Format parametrów operatora aktualizacji wygląda następująco:

{
  <operator aktualizacji>: { <pole1>: <wartość1>, ... },
  <operator aktualizacji>: { <pole2>: <wartość2>, ... },
  ...
}

Wyjaśnienie:

  • : Operator aktualizacji
  • : Nazwa pola
  • <wartość1>: Parametr pola

Operator $set

Służy do aktualizacji dokumentów i tworzenia nowego pola, jeśli pole nie istnieje.

Aktualizacja pojedynczego dokumentu

Zaktualizuj dokument za pomocą metody db.collection.updateOne().

db.inventory.updateOne(
   { item: "papier" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

Wyjaśnienie aktualizacji:

  • Najpierw pobierz pierwszy dokument przy użyciu warunku zapytania (item = papier).
  • Użyj operatora $set do aktualizacji wartości pola size.uom na cm i aktualizacji wartości pola status na P.
  • Użyj operatora $currentDate do aktualizacji wartości pola lastModified na aktualną datę. Jeśli pole lastModified nie istnieje, $currentDate stworzy pole.

Aktualizacja wielu dokumentów

Użyj metody db.collection.updateMany() do aktualizacji wielu dokumentów spełniających warunek.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

Wyjaśnienie aktualizacji:

  • Najpierw pobierz wszystkie dokumenty przy użyciu warunku zapytania (qty < 50).
  • Użyj operatora $set do aktualizacji wartości pola size.uom na in i aktualizacji wartości pola status na P.
  • Użyj operatora $currentDate do aktualizacji wartości pola lastModified na aktualną datę. Jeśli pole lastModified nie istnieje, $currentDate stworzy pole.

Wskazówka: Operator $lt oznacza znaczenie "mniejsze niż".

Zastąpienie dokumentu

Aby zastąpić zawartość dokumentu (z wyjątkiem pola _id), możesz wykorzystać metodę db.collection.replaceOne(). Nowy dokument zastępujący może zawierać inne pola niż oryginalny dokument. Ponieważ pole _id jest niemienne, może zostać pominięte. Jednak jeśli zawierasz pole _id, jego wartość musi być zgodna z identyfikatorem aktualizowanego dokumentu.

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

Wyjaśnienie:

  • Najpierw użyj kryteriów zapytania (item=paper), aby otrzymać pierwszy dokument.
  • Następnie zastąp dopasowany dokument zawartością drugiego parametru metody replaceOne.

Zachowanie aktualizacji

Atomowość

Wszystkie operacje zapisu w MongoDB są atomowe na poziomie indywidualnego dokumentu.

Pole _id

Pole _id jest niemienne i nie może być aktualizowane.