Spring Data mongoTemplate.save()行为

时间:2016-08-17 16:33:57

标签: java spring mongodb spring-data spring-data-mongodb

使用mongoTemplate.save()持久保存文档时,它会销毁数据库文档中所有未映射的字段。

例如,你有一个集合“myDocument”,文件在mongodb中:

{
  "_id": ObjectId("552402c3186eb112488b45ea"),
  "field1": "value1",
  "field2": "value2"
}

您的域对象如下:

public class MyDocument {
  @Id
  private String id;
  private String field1;

  // getter and setter
}
更新您的文档后

MyDocument doc = myDocumentRepository.getById(<some_id>);
doc.setField1("value3");
mongoTemplate.save(doc);

您将在没有“field2”的集合中获取文档:

{
  "_id": ObjectId("552402c3186eb112488b45ea"),
  "field1": "value3"
}

看起来像是意外的行为,当很少有不同的应用程序使用同一个数据库时,它可能是一个真正的阻止。

重写MongoTemplate方法是否可接受? 任何其他想法将非常感激。

感谢。

更新

如@helmy所述,这是mongoTemplate.save()的工作方式,并且首选使用更新方法。但在这种情况下,我正在失去构建在mongodb映射框架中的生命周期事件。例如,验证不会对onBeforeSave事件中的侦听器触发的更新起作用...

1 个答案:

答案 0 :(得分:3)

这根本不是意外或令人惊讶,save()的工作原理 - 它会覆盖整个文档。

我建议您查看Spring Update类来执行更新。