尝试在MongoDB SpringBoot中更新对象的字段时出现重复键错误

时间:2018-08-30 13:19:24

标签: java spring mongodb spring-boot

我正在尝试更新对象上的字段,然后尝试保存它。在将被调用的控制器中,代码就是这样。

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重复密钥错误索引:myapp.applicationUser。$ id 重复密钥:{: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;
    }       
}

我在这里做错了什么或应该如何处理?谢谢。

4 个答案:

答案 0 :(得分:0)

编辑: 将@Id字段设置为String。在mongo中将long值用作ID不好。 就像M. Wajdi所说的那样,您需要将setter添加到id字段中。


我看到您正在执行文档更新,因此应使用applicationUserRepository.save()而不是applicationUserRepository.insert()。 (实际上,我总是使用保存)。

说明:

插入总是尝试在数据库中引入新对象。 首次创建ApplicationUser时,insert在数据库中创建对象并为其分配ID。 但是,如果您阅读,更新并尝试再次插入它,Mongo将会理解您实际上是在尝试引入具有相同ID的新对象(而不是对该对象执行更新)。 这就是为什么您会收到该异常(重复的密钥)的原因。

答案 1 :(得分:0)

您尝试插入具有相同ID的现有用户 函数插入,我认为您应该使用更新功能

进行更改

答案 2 :(得分:0)

您没有使用ID的设置器,因此需要将其设置为自动增量

public class ApplicationUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    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;
    }       
}

答案 3 :(得分:0)

在选择long(或其他任何原始类型)作为mongo @Id时,则必须迎合id的生成,否则每次它将提供long的默认值,即0

有关自动增量排序的信息,请参见Auto increment sequence in mongodb using java

其他类型为String的@Id,mongo自动生成十六进制类型的默认ID,有关更多信息,请参考https://docs.mongodb.com/manual/reference/method/ObjectId/