【问题标题】:The unique Option is Not a Validator in Mongoose唯一的选项不是猫鼬中的验证器
【发布时间】:2020-10-03 13:33:07
【问题描述】:

我正在阅读 Mongoose 中的验证文档。但是我没有得到this part,有人可以用不同的例子给我解释一下吗?

它说“初学者的一个常见问题是模式的唯一选项不是验证器。”这是什么意思?谢谢!

【问题讨论】:

    标签: mongodb validation mongoose unique


    【解决方案1】:

    unique 选项用于在基础 MongoDB 集合中的指定字段上创建 unique index。 Mongoose 验证器选项(例如 maxrequired)在将查询发送到 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 完成唯一索引的构建。

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2019-04-25
      • 2018-11-16
      • 1970-01-01
      • 2017-04-07
      • 2018-11-25
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多