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
运行(且$push
and$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
。
他们分享的能力:
类型验证。猫鼬默认情况下会尝试将值转换为架构中指定的类型。带有$type
属性的MongoDB在类型不匹配的情况下会导致验证失败。
最小和最大数值。猫鼬在模式上使用min
和max
属性。MongoDB使用$lt
,$lte
,$gt
和$gte
。
字符串枚举。猫鼬使用enum: [values]
。MongoDB使用$in: [values]
。
字符串长度验证。猫鼬:minlength: 2, maxlength: 10
。MongoDB,使用正则表达式:{fieldname: {$regex: /.{2,10}/}}
。
数组长度验证。猫鼬,您必须使用自定义验证程序。MongoDB :{fieldName: {$size: 2}}
。
字符串RegExp匹配。猫鼬,您必须使用自定义验证程序。
第一个要点是重要的。MongoDB 没有事务, 现在有事务,但是它确实具有功能强大(且便宜)的原子更新。您通常无法可靠或安全地读取->更改->验证->使用MongoDB进行写入,因此在这些情况下,使用MongoDB本机验证器至关重要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句