Mongo3.2有文档验证,我们能用它来定义模式而不是用mongoose来定义模式吗.?例如:

Mongoose

userschema = mongoose.Schema({
   org: String,
   username: String,
   fullname: String, 
   password: String,
   email: String
});

MongoDB

db.createCollection(
   "example",{
     validator:{
       $and:[
         { "org":{$type:"string"}},
         { "username":{$type:"string"}},
         { "fullname":{$type:"double"}},
         {"password":$type:"string"}},
         {"email":{$type:"string"}}
       ]
     }, 
     validationLevel:"strict",
     validationAction:"error"
 })

这两个选项之间有什么区别?我们可以像在模式中一样使用validator提供可选字段吗?

推荐答案

我使用这两种方法是因为它们都有不同的限制:

  • Mongoose验证器不会在所有类型的更新查询上运行,验证器只在更新文档中有值的路径上运行,因为验证器无法知道数据库中是否已经定义了必填字段,但客户机内存中没有定义该字段(参见issue).This is a major reason to use MongoDB validators [in addition to Mongoose validators].

    更新验证器仅在$set$unset个操作上运行(以及在>;=4.8.0中的$push$addToSet).

    因此,在Mongoose模式中可以有一个带有required: true的字段,但update操作实际上并不需要该字段!MongoDB验证器可以解决这个问题:

      db.runCommand({collMod: "collection", validator: {myfield: {$exists: true}}})
    
  • 在验证期间,MongoDB在很大程度上不能引用其他字段.例如,你不能说{field1: {$lte: field2}}.Mongoose验证器可以引用其他字段.

    不过,您可以进行一些非常基本的跨字段引用:

      {validator: {myfield1: "Value 1", $and: [/* other validators */]}
    

    如果您使用Mongoose鉴别器(继承),并且对每个子类型都有不同的要求,那么这很方便.

  • 如果验证失败,MongoDB不提供"nice"错误;它只是说writeError: {code: 121, errmsg: "Document failed validation}左右.mongoose 通常会说Path 'foo.bar' failed validation之类的话.

    MongoDB is fixing this in v4.6

他们共享的能力:

  • 类型验证.默认情况下,Mongoose会try 将值强制转换为架构中指定的类型.如果类型不匹配,具有$type属性的MongoDB将导致验证失败.

  • 最小和最大数值.Mongoose在模式上使用minmax个属性.MongoDB使用$lt$lte$gt$gte.

  • 字符串枚举.mongoose 使用enum: [values].MongoDB使用$in: [values].

  • 字符串长度验证.mongoose :minlength: 2, maxlength: 10.MongoDB,使用正则表达式:{fieldname: {$regex: /.{2,10}/}}.

  • 数组长度验证.Mongoose您必须使用自定义验证器.MongoDB:{fieldName: {$size: 2}}.

  • 字符串RegExp匹配.Mongoose您必须使用自定义验证器.


第一点很重要.MongoDB没有事务现在有事务,但它有强大(且廉价)的原子更新.您经常无法可靠或安全地阅读->;改变->;验证->;使用MongoDB编写,因此在这些情况下使用MongoDB本机验证器是至关重要的.

Mongodb相关问答推荐

在单个mongo文档中组合数组与聚合

MongoDB-如何过滤和获取数组字段中的最新数据

MongoDB聚合如何对对象数组中的值求和

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

Select 筛选聚合中的嵌套字段

如何在Mongodb Mongoose Nodejs中提取不等于一组值的字段

$group 和 sum + 添加所有大于

如何在mongoDB中按嵌套文档分组( group by )

MongoDB:插入重复键更新

如何将 json 字符串编组到 bson 文档以写入 MongoDB?

在 mongoDB 中存储 java 8 LocalDate

Express 无法 PUT/DELETE 方法.出了什么问题?

如何在 mongo JavaScript shell 中中止查询

如何在 Mongoose 中更新数组值

Django admin 和 MongoDB,可能吗?

在 mongoDB 中展平嵌套的 JSON struct

将 MongoCursor from ->find() 转换为数组

MongoDB:删除唯一约束

Mongoose 为所有嵌套对象添加 _id

即使重新安装后,Mongo 仍在等待 27017