2015-03-13 294 views
13

的我使用的是:春天MongoRepository被更新或替代upserting插入

org.springframework.data.mongodb.repository.MongoRepository 

我先建立一个空数据库,并创建一个对象,具有_id = 1234例如,和其他一些字符串字段设置为hello例如,然后执行:

repository.save(object); 

一切都很好,它将文档保存在MondoDB中。

我创建了一个新的对象,设置相同_id = 1234但其他字符串字段设置为world,然后到另一个保存:

repository.save(newObject); 

结果:保存工作,但更新原始对象。

预期结果:由于_id是唯一的,因此应该会失败,因为DuplicateKeyException,因此每次保存时我使用2个单独的对象。

春季缺陷还是我做错了什么?

回答

18

保存根据定义,应该更新upsert样式中的对象,如果存在则更新对象,如果不存在则更新对象。 阅读save操作文档上的MongoDB website

插入 MongoDB中操作有你所期望的行为,但是从MongoRepository文档似乎插入委托保存,所以它不会有任何区别。但是你可以尝试一下,看看它是否适合你。否则,你可以先做一个get before来检查对象是否存在,因为它是索引查找,它会很快。

+0

问题是,'_id'似乎表现不同于任何其他领域。例如,如果我在mongo文档中有一个名为'name'的字段,并在该字段上创建一个UNIQUE索引,则执行我的问题中提到的步骤将导致抛出期望的'DuplicateKeyException'。而且,对于spring mongorepository API,没有'insert' API,只有'save'。我有一种感觉,这是春天的一个错误。 – Marc 2015-03-13 14:39:30

+2

有一个插入方法:http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/MongoRepository.html#insert-S- – tinker 2015-03-13 14:41:52

+0

索引验证是不同的,保存中的优化是它可以直接更新对象,如果它被发现,这是设计。 – tinker 2015-03-13 14:42:48