【发布时间】:2020-10-03 13:33:07
【问题描述】:
我正在阅读 Mongoose 中的验证文档。但是我没有得到this part,有人可以用不同的例子给我解释一下吗?
它说“初学者的一个常见问题是模式的唯一选项不是验证器。”这是什么意思?谢谢!
【问题讨论】:
标签: mongodb validation mongoose unique
我正在阅读 Mongoose 中的验证文档。但是我没有得到this part,有人可以用不同的例子给我解释一下吗?
它说“初学者的一个常见问题是模式的唯一选项不是验证器。”这是什么意思?谢谢!
【问题讨论】:
标签: mongodb validation mongoose unique
unique 选项用于在基础 MongoDB 集合中的指定字段上创建 unique index。 Mongoose 验证器选项(例如 max 和 required)在将查询发送到 MongoDB 之前在应用程序级别执行验证。以定义如下的事务模式为例:
const TransactionSchema = mongoose.Schema({
transactionType: { type: String, required: true },
amount: { type: Number, required: true, min: 1 },
}, { timestamps: true });
假设我们要向底层事务集合插入一个新事务,如下所示:
await Transaction.create([{
transactionType: 'credit',
amount: 0, // amount < min thus mongoose throws a validation exception.
}]);
在上面的 sn-p 中,mongoose 将为您的应用程序中的amount 属性引发验证异常,并且请求不会命中数据库。但是,unique 选项的行为并非如此。它不验证应用程序级别的属性。它唯一的工作就是在你的数据库中建立一个唯一的索引。
在尚未建立索引的情况下,两个或多个文档最终可能会共享一个本来应该是唯一的值。这种情况是下面提到的“竞争条件”。
const uniqueUsernameSchema = new Schema({
username: {
type: String,
unique: true
}
});
const U1 = db.model('U1', uniqueUsernameSchema);
const U2 = db.model('U2', uniqueUsernameSchema);
const dup = [{ username: 'Val' }, { username: 'Val' }];
U1.create(dup, err => {
// Race condition! This may save successfully, depending on whether
// MongoDB built the index before writing the 2 docs.
});
但是,如果已经建立了唯一索引并且运行了上面的操作,那么 MongoDB(不是 mongoose)会报错。因此,为什么您应该在编写之前等待 mongoose 完成唯一索引的构建。
【讨论】: