【问题标题】:spring data and mongodb : issue in updating existing documentspring data 和 mongodb:更新现有文档的问题
【发布时间】:2020-09-01 17:17:42
【问题描述】:

创建一个状态为 pending 和 generated-token 的文档,然后发送邮件

在发送邮件后立即通过生成的令牌值检索文档并将先前的状态更改为未验证。

即使为了更新文档状态,首先检索现有文档然后只更新它,最终仍然会为两种状态创建两个不同的文档。

@Document
public class VerificationInfo {         
    private LoginInfo user; 
    private String token; 
    private String verificationStatus = VerificationStatus.PENDING.getVerificationStatus();
}

道服务

public void updateStatus(VerificationInfo verificationToken, String status) {
        VerificationInfo vt = verificationRepository.findByToken(verificationToken.getToken()).get(0);
        vt.setVerificationStatus(status);
        verificationRepository.save(vt);
    }

存储库

@Repository
public interface VerificationRepository extends MongoRepository<VerificationInfo, String> {
     List<VerificationInfo> findByToken(String token);
     List<VerificationInfo> findByUser(LoginInfo user);
}

数据库条目

{ "_id" : ObjectId("5f4e7486664e197f3d745b17"), "token" : "c82907b7-e13e-484d-89cf-92ea394b6f6d", "verificationStatus" : "pending", "_class" : "com.models.VerificationInfo" }
{ "_id" : ObjectId("5f4e748b664e197f3d745b18"), "token" : "c82907b7-e13e-484d-89cf-92ea394b6f6d", "verificationStatus" : "unverified", "_class" : "com.models.VerificationInfo" }

【问题讨论】:

  • updateStatus() 中的状态打印是什么
  • @varman 设置为未验证,仅打印为未验证。即使在 DB 中也可以保存正确的值,但唯一的问题是创建新文档而不是更新现有文档
  • 你没有唯一的id吗?
  • 您的文档是否使用任何 id 进行了更新?
  • 默认情况下 mongodb 正在创建 _id。否则它需要具有唯一性吗?

标签: java mongodb spring-boot spring-data spring-data-mongodb


【解决方案1】:

如果状态正确,您的问题文档的标识(_id)

public class VerificationInfo {
    @Id
    ObjectId _id;
    // Other fields
}

这里我们为每个文档设置了一个唯一的 id。因此,当您创建一个对象时,它将创建一个新文档。如果 _id 已经存在于数据库中,那么它将根据特定的 id 更新文档。

1.模型类中不存在 _id

extends MongoRepository&lt;VerificationInfo, String&gt;,第二个参数是id的类型。但是在您的模型类中没有找到任何id。 (一般我们用ObjectId,也可以给String

2。当您从前端获取数据时,它总是会创建新文档

由于您没有 id,当您将数据传递给 updateStatus(VerificationInfo verificationToken, String status) 时,它将创建新的 id 并设置数据,这就是您总是获取新文档的原因。

假设您使用现有id 发送数据,那么现有文档将根据给定的id 进行更新

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2012-05-18
    • 1970-01-01
    • 2015-02-22
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多