Spring Data:MongoDB 文档中的唯一字段

StS*_*Sch 10 java spring mongodb spring-data

假设我有以下数据库实体:

@Document(collection = "users")
public class User {

    @Id
    private String id;

    private String firstname;

    private String lastname;

    private String email; 

}
Run Code Online (Sandbox Code Playgroud)

如何强制字段电子邮件是唯一的?这意味着当应用程序尝试保存实体时,MongoDB 应该检查具有此电子邮件地址的用户记录是否已经存在。

问候, 史蒂芬

V.A*_*wal 11

Mongodb 需要创建和索引一个字段,以便知道该字段是否唯一。

@Indexed(unique=true)
private String email;
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这个,mongo 驱动程序没有执行任何强制措施来使其独一无二 (2认同)

Ahm*_*ani 9

Indexed首先,在模型中使用字段上方的注释,如下所示:

@Indexed(unique = true)
private String email;
Run Code Online (Sandbox Code Playgroud)

另外,您应该以编程方式定义索引。定义您的MongoTemplate.

mongoTemplate.indexOps("YOUR_COLLECTION_NAME").ensureIndex(new Index("YOUR_FEILD_OF_COLLECTION", Direction.ASC).unique());
Run Code Online (Sandbox Code Playgroud)

对于您的情况,您应该使用:

mongoTemplate.indexOps("users").ensureIndex(new Index("email", Direction.ASC).unique());
Run Code Online (Sandbox Code Playgroud)

  • 如果所有工作都在“mongoTemplate”上完成,为什么我们需要使用注释? (15认同)

小智 9

这对我有用,但是您必须删除数据库,然后重新运行您的应用程序

 spring.data.mongodb.auto-index-creation=true
Run Code Online (Sandbox Code Playgroud)


Moh*_*agh 6

从 Spring Data MongoDB 3.0 开始,自动索引创建默认是关闭的。所以基本上,除了使用 之外@Indexed,您还必须配置默认索引选项。您需要做的就是spring.data.mongodb.auto-index-creation=trueapplication.properties文件中进行制作,然后@Indexed就会像魅力一样工作!