Este capítulo presenta cómo actualizar datos de documentos en Golang MongoDB.

Funciones de actualización compatibles con MongoDB

  • Collection.UpdateOne: actualiza un solo dato
  • Collection.UpdateMany: actualiza datos en lotes
  • Collection.ReplaceOne: reemplaza datos

Preparar datos de prueba

Inserta un lote de datos en la colección "coll"

docs := []interface{}{
	bson.D{
		{"item", "canvas"},
		{"qty", 100},
		{"size", bson.D{
			{"h", 28},
			{"w", 35.5},
			{"uom", "cm"},
		}},
		{"status", "A"},
	},
	// ...
}

resultado, err := coll.InsertMany(context.Background(), docs)

Actualizar un documento

resultado, err := coll.UpdateOne(
	context.Background(), // Obtener el parámetro de contexto
	bson.D{ // Establecer los criterios de consulta para encontrar el documento con item=paper
		{"item", "paper"},
	},
	bson.D{ // Establecer la expresión de actualización
		{"$set", bson.D{ // Utilizar el operador $set para establecer el contenido del campo actualizado
			{"size.uom", "cm"},  // Cambiar el valor de size.uom a cm
			{"status", "P"}, // Cambiar el valor de status a P
		}},
		{"$currentDate", bson.D{  // Utilizar el operador $currentDate para actualizar el valor del campo lastModified con la hora actual
			{"lastModified", true},
		}},
	},
)

Busca un documento basado en los criterios de consulta y luego actualiza el contenido de este documento.

Consejo: Si no estás familiarizado con MongoDB, por favor lee el tutorial de MongoDB.

Actualizar documentos en masa

La diferencia con la función UpdateOne es que UpdateMany actualiza en masa los documentos coincidentes basados en los criterios de coincidencia.

resultado, err := coll.UpdateMany(
	contexto.Background(),
	bson.D{ // Establecer los criterios de consulta, qty > 50
		{"qty", bson.D{
			{"$lt", 50},
		}},
	},
	bson.D{ // Establecer el contenido de la actualización
		{"$set", bson.D{
			{"size.uom", "cm"},
			{"status", "P"},
		}},
		{"$currentDate", bson.D{
			{"lastModified", true},
		}},
	},
)

Reemplazar un documento

Consultar un documento especificado basado en los criterios de consulta y reemplazar el contenido del documento con el contenido especificado.

Consejo: Reemplazar un documento se refiere a la sustitución global, no a la actualización parcial de ciertos valores de campo en el documento.

resultado, err := coll.ReplaceOne(
	contexto.Background(),
	bson.D{ // Establecer los criterios de consulta, item=papel
		{"item", "papel"},
	},
	bson.D{ // Establecer el nuevo contenido del documento
		{"item", "papel"},
		{"instock", bson.A{
			bson.D{
				{"almacén", "A"},
				{"qty", 60},
			},
			bson.D{
				{"almacén", "B"},
				{"qty", 40},
			},
		}},
	},
)

Primero, basado en los criterios de consulta, encontrar el documento con item=papel, y luego reemplazarlo con el nuevo contenido del documento.