猫鼬架构与Mongo验证器

索拉·维玛(Saurabh Verma)

Mongo 3.2具有文档验证功能,我们可以使用相同的方法来定义架构而不是使用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提供一个可选字段吗?

扎克

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

  • 猫鼬验证器不能在所有类型的更新查询上运行,并且验证器只能在带有更新文档中值的路径上运行,因为验证器无法知道(例如)数据库中是否已定义了必填字段,而客户端的字段中却没有内存(请参阅问题)。这是使用MongoDB验证器(除了Mongoose验证器之外)的主要原因。

    更新验证程序仅在$set和上$unset运行(且$pushand $addToSet> = 4.8.0)。

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

      db.runCommand({collMod: "collection", validator: {myfield: {$exists: true}}})
    
  • 在验证期间,MongoDB大多数情况下无法引用其他字段。例如,您不能说{field1: {$lte: field2}}猫鼬验证器可以引用其他字段。

    但是,您可以执行一些非常基本的跨字段引用类型:

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

    如果您使用的是Mongoose鉴别器(继承性),并且对每种子类型都有不同的要求,这将很方便。

  • 在验证失败的情况下,MongoDB不提供“不错的”错误;它只是说一些像writeError: {code: 121, errmsg: "Document failed validation}猫鼬通常会说类似Path 'foo.bar' failed validation

    MongoDB正在v4.6中修复此问题

他们分享的能力:

  • 类型验证。猫鼬默认情况下会尝试将值转换为架构中指定的类型。带有$type属性的MongoDB在类型不匹配的情况下会导致验证失败。

  • 最小和最大数值。猫鼬在模式上使用minmax属性。MongoDB使用$lt$lte$gt$gte

  • 字符串枚举。猫鼬使用enum: [values]MongoDB使用$in: [values]

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

  • 数组长度验证。猫鼬,您必须使用自定义验证程序。MongoDB :{fieldName: {$size: 2}}

  • 字符串RegExp匹配。猫鼬,您必须使用自定义验证程序。


第一个要点是重要的。MongoDB 没有事务, 现在有事务,但是它确实具有功能强大(且便宜)的原子更新。您通常无法可靠或安全地读取->更改->验证->使用MongoDB进行写入,因此在这些情况下,使用MongoDB本机验证器至关重要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章