例如我有一个模型:
@Document(collection = "events")
public class Event {
@Id
private String id;
private String value1;
private Spring value2;
}
服务类中的一些代码:
Event event = eventRepository.findOne("1");
event.setValue1("newValue1");
eventRepository.save(event);
Spring Data是更新文档的所有字段还是仅更改字段? 在这种情况下,什么是关于field2,它将用旧值更新?
如何打开日志以检查弹簧数据究竟是做什么的?
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
这一次只打开查询的日志,而不是更新:
016-10-10 09:39:25.938 DEBUG 11417 --- [ restartedMain] o.s.data.mongodb.core.MongoTemplate : findOne using query: { "_id" : "1"} in db.collection: t87.events
2016-10-10 09:39:25.965 DEBUG 11417 --- [ restartedMain] o.s.data.mongodb.core.MongoTemplate : Saving DBObject containing fields: [_class, _id, value1, value2]
答案 0 :(得分:2)
MongoRepository.save()
在幕后调用MongoDB db.collection.save。根据{{1}}的值,它可以插入/替换/替换整个文档。
所以,回答你的问题:
Spring Data是更新文档的所有字段还是仅更改字段?在这种情况下,关于field2的内容是什么,是否会使用旧值更新?
所有字段都已更新(插入),包括具有旧值的字段-2。
为了只设置字段-1 - 效率更高 - 您必须将id
与MongoTemplate
和Update
运算符结合使用。
为了了解发生了什么,您最好查看MongoDB日志,了解如何处理更新操作。有关如何捕获每个写入操作,请参阅setProfilingLevel;您可能需要通过将分析级别设置为2来记录每个操作。不要忘记之后将其关闭。