Mongoose中可选唯一String字段的唯一性约束行为问询
Mongoose可选字段设置unique约束的行为分析
首先,你给出的Schema定义如下:
import { Schema } from "mongoose"; export interface IString { property: string; } export const PriceOverhaulSchema = new Schema<IString>({ property: { type: String, required: false, unique: true }, });
该Schema对集合的影响
- 对应MongoDB中的集合默认名为
priceoverhauls(Mongoose会自动将Schema名转为小写复数形式) - 文档可包含
property字符串字段,该字段非必填 - MongoDB会自动为
property字段创建唯一索引
核心问题解答
当字段设为可选且加unique约束时,未设置该字段的文档会被MongoDB视为该字段值为null,而默认的唯一索引会把null当作普通有效值处理:
- 如果已经存在一个未设置
property的文档,再创建第二个未设置该字段的文档时,会触发唯一性约束冲突,操作直接失败 - 唯一性约束是对所有文档强制执行的,无论是否显式设置了该字段——因为无字段的文档在索引中会以
null占位,唯一索引不允许重复的null值
如果想要让唯一索引仅对设置了property字段的文档生效(忽略无该字段的文档),可以给字段配置添加sparse: true(稀疏索引),修改后的字段配置如下:
property: { type: String, required: false, unique: true, sparse: true }
稀疏索引只会包含存在该字段的文档,这样多个未设置property的文档就不会触发唯一性冲突了。
内容的提问来源于stack exchange,提问作者Shocky2
相关产品推荐
相关产品推荐

