解决步骤

更新整个对象使用save()

更新某个字段而不是整个对象请使用updateFirst()或者updateMulti(),而不是save()

问题说明

项目开发过程中使用到了Spring Data操作Mongo

例:根据id更新sku数据

mongoTemplate.save(sku)

原文档

{ 
"_id" : ObjectId("5ef9a63c1dd6b500c38eb784"),
"product_id" : ObjectId("5ef952254538f17296470d6f"),
"sku_attr_id" : ObjectId("5ef9a5c11dd6b500c38eb781"),
"barcode": ["15134643623"],
"rrp" : NumberDecimal("1588.00"),
"default_warning_qty" : NumberInt(60),
"default_replenish_qty" : NumberInt(10),
"create_time" : NumberLong(0),
"update_time" : NumberLong(1593683512413),
"delete_time" : NumberLong(0)
}

代码执行操作kotlin伪代码

val productSku = ProductSku()
productSku.id = ObjectId(spec.skuId)
productSku.defaultWarningQty = spec.defaultWarningQty
mongoTemplate.save(ProductSku)

运行后文档丢失数据

{
"_id" : ObjectId("5ef9a63c1dd6b500c38eb784"),
"default_warning_qty" : NumberInt(60)
}

参考文献

Spring Data mongoTemplate.save() behaviour

Spring Data MongoDB更新