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在模式上使用
min
和max
属性。 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器是至关重要的。