You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注解配合自动索引扫描实现:

  1. 给数据类的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()
) 
  1. 程序启动时调用扫描方法,自动为指定包下所有带索引注解的实体类创建索引:
// 替换为你存放实体类的包路径
database.ensureIndexes("com.yourproject.entity")

注意事项

  • 创建唯一索引前需要确保集合内不存在重复的email值,否则索引会创建失败。
  • 插入重复email数据时会抛出错误码为11000的MongoWriteException,你可以捕获该异常返回对应的业务错误提示。

内容的提问来源于stack exchange,提问作者L. Blommers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:39:03