MongoDB 唯一索引未在 Spring Boot 中创建

cnm*_*muc 5 java spring mongodb spring-boot

在 Spring boot + MongoDB 应用程序中,我正在尝试为电子邮件字段创建唯一索引。

@Document
public class User {

    @Id
    private String id;

    @Indexed(unique = true)
    private String email;

}
Run Code Online (Sandbox Code Playgroud)
public interface UserRepository extends MongoRepository<User, String>
Run Code Online (Sandbox Code Playgroud)

但是我仍然可以使用相同的电子邮件插入两个用户对象,所以

userRepository.save(new User("my@email.com"))
userRepository.save(new User("my@email.com"))
Run Code Online (Sandbox Code Playgroud)

在用户集合中创建两个条目。

我究竟做错了什么?

我知道Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?,但我正在寻找“仅注释”的解决方案。

Tim*_*mes 11

我引用了文档

Spring Data MongoDB 可以自动为用@Document 注释的实体类型创建索引。自 3.0 版起,必须显式启用索引创建,以防止对集合生命周期和性能产生不良影响。

您是否启用了自动索引创建?因为如果你没有这样做,那很可能就是你的独特约束没有得到尊重的原因。您可以通过连接到 MongoDB 实例并运行db.user.getIndexes(). 这将打印用户集合的索引。

使用 Spring Boot,您可以使用以下配置启用自动索引创建application.yml

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

或者,如果您更喜欢属性:

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


Rah*_*hak 0

检查 - https://docs.mongodb.com/manual/core/index-unique/

它指出 - 如果集合已包含违反索引唯一约束的数据,则 MongoDB 无法在指定索引字段上创建唯一索引。

因此,如果您的集合中很少有文档已经具有相同的电子邮件值,那么如果您尝试在电子邮件字段上创建索引,它可能不起作用。检查您是否有此类文件。