尝试更新MongoDB SpringBoot中对象的字段时出现java重复密钥错误
我正在尝试更新对象上的字段,然后尝试保存它。在将被调用的控制器中,代码如下所示
ApplicationUser user = applicationUserRepository.findByVerificationCode(verificationCode);
if(user != null) {
user.setVerified(true);//trying to change a value in a field
applicationUserRepository.save(user);
return new ResponseEntity<>(user,new HttpHeaders(),HttpStatus.OK);
}
当我试图执行这段代码时,我得到了这个错误
E11000 duplicate key error index: myapp.applicationUser.$id dup key: { : 0 };
我在ApplicationUser类中显式定义Id。 我的ApplicationUser类是这样的
public class ApplicationUser {
@Id
private long id;
private String username;
private String password;
private String name;
private String email;
private String verificationCode;
private boolean verified=false;
private List<Company> boughtCompanies;
public long getId() {
return id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getVerificationCode() {
return verificationCode;
}
public void setVerificationCode(String verificationCode) {
this.verificationCode = verificationCode;
}
public List<Company> getBoughtCompanies() {
return boughtCompanies;
}
public void setBoughtCompanies(List<Company> boughtCompanies) {
this.boughtCompanies = boughtCompanies;
}
public boolean isVerified() {
return verified;
}
public void setVerified(boolean verified) {
this.verified = verified;
}
}
我在这里做错了什么,或者应该如何处理?谢谢
# 1 楼答案
编辑: 将@Id字段设置为字符串。在mongo中使用长值作为ID是不好的。 正如M.Wajdi所说,您需要将setter添加到id字段中
我看到您正在执行文档更新,因此应该使用applicationUserRepository。save()而不是applicationUserRepository。插入()。(实际上,我总是使用save)
说明:
Insert始终尝试在数据库中引入新对象。 第一次创建ApplicationUser时,insert将在DB中创建对象并为其分配一个ID。 但是如果您阅读、更新它并再次尝试插入它,Mongo将理解您实际上是在尝试引入具有相同ID的新对象(而不是在该对象中执行更新)。 这就是为什么你会得到那个例外,重复的密钥
# 2 楼答案
您尝试插入具有相同id的现有用户 函数insert我想你应该用函数update来改变它
# 3 楼答案
当选择long(或任何其他原语)作为mongo@Id时,您必须满足Id生成的需要,否则每次它都会给出long默认值,即0
有关自动增量排序,请参阅此处已回答的Auto increment sequence in mongodb using java
否则,使@Id为String类型,mongo自动生成hexadeximal类型的默认Id,有关更多信息,请参阅https://docs.mongodb.com/manual/reference/method/ObjectId/
# 4 楼答案
您没有使用ID的setter,因此需要将其设置为自动增量