参考文献

Spring Data mongoTemplate.save() behaviour

Spring Data MongoDB更新

问题还原

项目开发过程中使用到了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)
}

解决步骤

更新整个对象使用save()

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