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

7
在一个Spring Boot + MongoDB应用中,我正在尝试为电子邮件字段创建一个唯一索引。
@Document
public class User {

    @Id
    private String id;

    @Indexed(unique = true)
    private String email;

}

public interface UserRepository extends MongoRepository<User, String>

但是我仍然能够插入两个具有相同电子邮件的用户对象,所以

userRepository.save(new User("my@email.com"))
userRepository.save(new User("my@email.com"))

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

我做错了什么?

我知道Spring Data MongoDB - Where to create an index programmatically for a Mongo collection?,但我正在寻找一个“仅使用注释”的解决方案。

3个回答

15

我引用了文档:

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

你是否启用了自动索引创建?如果没有,那很可能是你的唯一约束条件未被遵守的原因。你可以通过连接到MongoDB实例并运行db.user.getIndexes()来验证不存在任何索引。这将打印出用户集合的索引。

使用Spring Boot,你可以通过在你的application.yml中添加以下配置来启用自动索引创建:

spring:
  data:
    mongodb:
      auto-index-creation: true

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

spring.data.mongodb.auto-index-creation=true

0

0

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

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

因此,如果您的集合中已经有几个文档具有相同的电子邮件值,则如果您尝试在电子邮件字段上创建索引,则可能无法正常工作。请检查是否有这样的文档。


谢谢,但是集合为空。 - cnmuc
@cnmuc 尝试清除整个数据库,然后再试一次...这对我有用。 - davyCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接