gpt4 book ai didi

java - spring data mongorepository.save E11000 有时出现重复键错误索引

转载 作者:行者123 更新时间:2023-12-03 15:59:42 24 4
gpt4 key购买 nike

我使用 jhipster 创建了应用程序,其中我使用 MongoRepository 插入或保存文档。但有时会抛出异常,但无法找出可能的原因。我在生产环境(即 ubuntu)中遇到以下异常:

nested exception is com.mongodb.DuplicateKeyException: Write failed with 
error code 11000 and error message 'E11000 duplicate key error index:
db_test.collection_test.$_id_ du
p key: { : "1212" }'
at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:73)
at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2114)
at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:464)
at org.springframework.data.mongodb.core.MongoTemplate.saveDBObject(MongoTemplate.java:1080)
at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1015)
at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:961)
at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:80)

以下是java代码:

@JsonIgnoreProperties(ignoreUnknown = true)
@Document(collection = "collection_test")
public class CollectionTest implements Serializable {

@Id
private String id;

@Field("c_date")
@Indexed
private String cDate;

public CollctionTest() {
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getCDate() {
return cDate;
}

public void setCDate(String cDate) {
this.cDate = cDate;
}

@Override
public String toString() {
return "CollctionTest{" +
"id='" + id + '\'' +
", cDate='" + cDate + '\'' +
'}';
}

}

public interface CollectionTestRepository extends 
MongoRepository<CollectionTest, String> {
}

@Component
public class CollectionTestService implements ICollectionTestService {

@Autowired
private CollectionTestRepository collectionTestRepository ;

public void saveOrUpdate(CollectionTest collectionTest ) {
try {
collectionTestRepository.save(collectionTest);
LOGGER.info("Inserted document with id: " + collectionTest .getId()
+ " into database");

} catch (Exception ex) {
LOGGER.error("Exception during save or update", ex);
}
}

}

注意:此应用程序通过rabbitmq监听器使用集合测试对象并调用saveOrUpdate()方法。

_id 具有我们生成的值中的自定义值。如果 _id 已存在于数据库中,则只需更新文档,否则插入新文档。使用 MongoRepository.save() 达到相同目的

最佳答案

当您的数据库中有唯一索引并尝试放置重复的数据字段时,数据库会发生此特殊异常。

首先,检查当前的唯一索引:

db.collectionName.getIndexes()

您尝试更新特定 id 上的文档,并为其他索引字段添加重复数据,在这种情况下,DB 会引发 _id 字段索引异常。虽然这是错误的异常,但它应该显示特定的重复索引名称字段,但因为您正在执行更新操作,所以它显示在 _id 上

在编码中,请始终记住,如果您使用任何唯一索引,则在调用之前首先保存以获取唯一索引键上的特定集合,然后调用更新。

关于java - spring data mongorepository.save E11000 有时出现重复键错误索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50684340/

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