Эта глава рассказывает о том, как обновлять данные документов в Golang MongoDB.

Функции обновления, поддерживаемые MongoDB

  • Collection.UpdateOne - Обновляет один отдельный документ
  • Collection.UpdateMany - Обновляет данные пакетами
  • Collection.ReplaceOne - Заменяет данные

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

Вставьте пакет данных в коллекцию "coll"

docs := []interface{}{
	bson.D{
		{"item", "canvas"},
		{"qty", 100},
		{"size", bson.D{
			{"h", 28},
			{"w", 35.5},
			{"uom", "cm"},
		}},
		{"status", "A"},
	},
	...
}
result, err := coll.InsertMany(context.Background(), docs)

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

result, err := coll.UpdateOne(
	context.Background(), // Получаем параметр контекста
	bson.D{ // Устанавливаем критерии запроса для поиска документа с item=paper
		{"item", "paper"},
	},
	bson.D{ // Устанавливаем выражение обновления
		{"$set", bson.D{ // Используем оператор $set для установки обновленного содержания поля
			{"size.uom", "cm"},  // Изменяем значение size.uom на cm
			{"status", "P"}, // Изменяем значение status на P
		}},
		{"$currentDate", bson.D{  // Используем оператор $currentDate для обновления значения поля lastModified на текущее время
			{"lastModified", true},
		}},
	},
)

Находим документ на основе критериев запроса, а затем обновляем содержимое этого документа.

Совет: Если вы не знакомы с MongoDB, пожалуйста, прочтите руководство по MongoDB.

Массовое обновление документов

UpdateMany отличается от функции UpdateOne в том, что он выполняет массовое обновление соответствующих документов на основе установленных критериев.

result, err := coll.UpdateMany(
    context.Background(),
    bson.D{ // Установите критерии запроса, qty > 50
        {"qty", bson.D{
            {"$lt", 50},
        }},
    },
    bson.D{ // Установите обновляемое содержимое
        {"$set", bson.D{
            {"size.uom", "cm"},
            {"status", "P"},
        }},
        {"$currentDate", bson.D{
            {"lastModified", true},
        }},
    },
)

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

Запросите указанный документ на основе критериев запроса и замените содержимое документа указанным содержимым.

Совет: Под заменой документа подразумевается полная замена, а не частичное обновление определенных значений полей в документе.

result, err := coll.ReplaceOne(
    context.Background(),
    bson.D{ // Установите критерии запроса, item=paper
        {"item", "paper"},
    },
    bson.D{ // Установите новое содержимое документа
        {"item", "paper"},
        {"instock", bson.A{
            bson.D{
                {"warehouse", "A"},
                {"qty", 60},
            },
            bson.D{
                {"warehouse", "B"},
                {"qty", 40},
            },
        }},
    },
)

Сначала, на основе критериев запроса, найдите документ с item=paper, затем замените его указанным новым содержимым.