KMongo如何为数据类指定字段添加唯一性约束
KMongo实现User类email字段唯一的解决方案
核心原因
你之前加的唯一注解未生效,是因为KMongo没有内置自动生效的字段级唯一约束注解,MongoDB的唯一约束本质是集合层面的唯一索引,需要主动创建才会生效。
实现方案
方案1:手动创建唯一索引(推荐)
直接在程序启动阶段为User集合的email字段创建唯一索引即可,该操作幂等,重复调用不会重复生成索引:
// 先获取User对应集合实例 val userCol = database.getCollection<User>() // 为email字段创建唯一索引 userCol.ensureUniqueIndex(User::email)
如果需要过滤掉email为空的文档,避免空值触发唯一约束,可以加索引配置:
import org.litote.kmongo.* import com.mongodb.client.model.IndexOptions import com.mongodb.client.model.Filters userCol.ensureUniqueIndex( User::email, indexOptions = IndexOptions() .unique(true) .partialFilterExpression(Filters.exists("email", true)) )
方案2:注解+自动扫描索引
如果不想手动为每个集合声明索引,可以用KMongo提供的@Indexed注解配合自动索引扫描实现:
- 给数据类的email字段加注解:
@Serializable data class User( @SerialName("_id") val _id: Id<User> = newId(), @Indexed(unique = true) // 加唯一索引注解 val email: String, var password: String, var tokens: Array<String> = arrayOf() )
- 程序启动时调用扫描方法,自动为指定包下所有带索引注解的实体类创建索引:
// 替换为你存放实体类的包路径 database.ensureIndexes("com.yourproject.entity")
注意事项
- 创建唯一索引前需要确保集合内不存在重复的email值,否则索引会创建失败。
- 插入重复email数据时会抛出错误码为11000的
MongoWriteException,你可以捕获该异常返回对应的业务错误提示。
内容的提问来源于stack exchange,提问作者L. Blommers
相关产品推荐
相关产品推荐

