调用modelRepository.save()时spring-data-mongodb到底做了什么?

时间:2016-10-10 09:58:41

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

例如我有一个模型:

@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]

1 个答案:

答案 0 :(得分:2)

MongoRepository.save()在幕后调用MongoDB db.collection.save。根据{{​​1}}的值,它可以插入/替换/替换整个文档。

所以,回答你的问题:

  
    

Spring Data是更新文档的所有字段还是仅更改字段?在这种情况下,关于field2的内容​​是什么,是否会使用旧值更新?

  

所有字段都已更新(插入),包括具有旧值的字段-2。

为了只设置字段-1 - 效率更高 - 您必须将idMongoTemplateUpdate运算符结合使用。

为了了解发生了什么,您最好查看MongoDB日志,了解如何处理更新操作。有关如何捕获每个写入操作,请参阅setProfilingLevel;您可能需要通过将分析级别设置为2来记录每个操作。不要忘记之后将其关闭。