gpt4 book ai didi

java - Spring Data mongoTemplate.save() 行为

转载 作者:可可西里 更新时间:2023-11-01 09:13:27 24 4
gpt4 key购买 nike

当您使用 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 事件中的监听器触发...

最佳答案

这一点都不意外或令人惊讶,这就是 save()有效——它会覆盖整个文档。

我建议您看一下 Spring Update类来执行您的更新。

关于java - Spring Data mongoTemplate.save() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com