mongoose纲要与Mongovalidation器

Mongo 3.2有文档validation,我们可以使用相同的定义一个模式,而不是使用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" }) 

这些拖曳之间的区别是什么,我们可以提供一个可选的字段使用validation程序在架构?

我使用两者,因为它们各有不同的局限性:

  • Mongoosevalidation器不会在所有types的更新查询上运行,而validation器只能在更新文档中的具有值的path上运行,因为validation器无法知道,例如,数据库中是否已经定义了必填字段,而客户端记忆(见问题 )。 这是使用MongoDBvalidation器[除了Mongoosevalidation器]的主要原因。

    更新validation器只能在$set$unset操作上运行( $push$addToSet在> = 4.8.0)。

    所以你可以在你的Mongoose模式中使用required: true ,但是update操作实际上并不需要这个字段! 一个MongoDBvalidation器可以解决这个问题:

     db.runCommand({collMod: "collection", validator: {myfield: {$exists: true}}}) 
  • 在validation过程中,大部分MongoDB不能引用其他字段。 例如,你不能说{field1: {$lte: field2}} 。 Mongoosevalidation器可以引用其他字段。

    你可以做一些非常基本的交叉字段引用types:

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

    如果您使用Mongoose鉴别器(inheritance),并且对每个子types有不同的要求,这就派上用场了。

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

他们分享的能力:

  • typesvalidation。 Mongoose尝试将值转换为模式中指定的types。 具有$type属性的MongoDB在types不匹配的情况下会导致validation失败。

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

  • string枚举。 Mongoose使用enum: [values] 。 MongoDB使用$in: [values]

  • string长度validation。 mongoose: minlength: 2, maxlength: 10 。 MongoDB,使用正则expression式: {fieldname: {$regex: /.{2,10}/}} . {fieldname: {$regex: /.{2,10}/}}

  • 数组长度validation。 mongoose你必须使用自定义validation器。 MongoDB: {fieldName: {$size: 2}}

  • stringRegExp匹配。 mongoose你必须使用自定义validation器。


第一个要点是重要的一点。 MongoDB没有事务,但是它有强大的primefaces更新。 你经常无法可靠或安全地读取 – >更改 – >validation – >使用MongoDB编写,因此在这些情况下使用MongoDB本地validation器是至关重要的。