Обновление данных документов MongoDB с использованием оболочки mongo

Эта глава посвящена обновлению данных документов MongoDB через оболочку mongo. MongoDB поддерживает различные способы обновления, реализуемые различными типами операторов, и также поддерживает несколько функций обновления.

Подготовка тестовых данных

Вставьте партию тестовых данных в коллекцию inventory.

db.inventory.insertMany( [
   { item: "холст", qty: 100, size: { h: 28, w: 35.5, uom: "см" }, status: "A" },
   { item: "журнал", qty: 25, size: { h: 14, w: 21, uom: "см" }, status: "A" },
   { item: "коврик", qty: 85, size: { h: 27.9, w: 35.5, uom: "см" }, status: "A" },
   { item: "коврик для мыши", qty: 25, size: { h: 19, w: 22.85, uom: "см" }, status: "P" },
   { item: "блокнот", qty: 50, size: { h: 8.5, w: 11, uom: "дюйм" }, status: "P" },
   { item: "бумага", qty: 100, size: { h: 8.5, w: 11, uom: "дюйм" }, status: "D" },
   { item: "планер", qty: 75, size: { h: 22.85, w: 30, uom: "см" }, status: "D" },
   { item: "открытка", qty: 45, size: { h: 10, w: 15.25, uom: "см" }, status: "A" },
   { item: "альбом для рисования", qty: 80, size: { h: 14, w: 21, uom: "см" }, status: "A" },
   { item: "блок для рисования", qty: 95, size: { h: 22.85, w: 30.5, uom: "см" }, status: "A" }
] );

Синтаксис оператора обновления

Для обновления документов MongoDB предоставляет несколько операторов обновления (например, $set) для изменения значений полей.

Формат параметров оператора обновления выглядит следующим образом:

{
  <оператор обновления>: { <поле1>: <значение1>, ... },
  <оператор обновления>: { <поле2>: <значение2>, ... },
  ...
}

Объяснение:

  • <оператор обновления>: оператор обновления
  • <поле1>: название поля
  • <значение1>: параметр поля

Оператор $set

Используется для обновления документов и создания нового поля, если поле не существует.

Обновление одного документа

Обновите документ, используя метод db.collection.updateOne().

db.inventory.updateOne(
   { item: "бумага" },
   {
     $set: { "size.uom": "см", status: "P" },
     $currentDate: { lastModified: true }
   }
)

Объяснение обновления:

  • Сначала получите первый документ, используя условие запроса (item = бумага).
  • Используйте оператор $set для обновления значения поля size.uom на см и обновления значения поля status на P.
  • Используйте оператор $currentDate для обновления значения поля lastModified на текущую дату. Если поля lastModified нет, $currentDate создаст поле.

Обновление нескольких документов

Используйте метод db.collection.updateMany() для обновления нескольких документов, удовлетворяющих условию.

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

Объяснение обновления:

  • Сначала получите все документы, удовлетворяющие условию запроса (qty < 50).
  • Используйте оператор $set для обновления значения поля size.uom на дюйм и обновления значения поля status на P.
  • Используйте оператор $currentDate для обновления значения поля lastModified на текущую дату. Если поля lastModified нет, $currentDate создаст поле.

Совет: Оператор $lt означает "меньше чем".

Замена документа

Используйте метод db.collection.replaceOne(), чтобы заменить содержимое документа (за исключением поля _id). Заменяемый документ может иметь различные поля по сравнению с исходным документом. Поскольку поле _id является неизменным, его можно опустить. Однако, если включить поле _id, значение id должно быть согласовано с id заменяемого документа.

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

Объяснение:

  • Сначала используйте критерии запроса (item=paper), чтобы извлечь первый документ.
  • Замените соответствующий документ содержимым второго параметра метода replaceOne.

Поведение обновления

Атомарность

Все операции записи в MongoDB атомарны на уровне отдельного документа.

Поле _id

Поле _id является неизменным и не может быть обновлено.