我希望在Mongo中拥有灵活的架构,但也希望为后续更新强制执行架构。是否可以将验证存储在文档中,如下所示? 我试过这个,但似乎无法将字符串转换为Joi对象。
{
"_id" : ObjectId("53d5dce1fc87899b2b3c2def"),
"name" : {
"validator" : "Joi.string().alphanum().min(3).max(30).required()",
"value" : "Bob"
},
"email" : {
"validator" : "Joi.string().email()",
"value" : "bob@gmail.com"
}
}
答案 0 :(得分:3)
大多数情况下,将可执行代码存储在数据库中并不是一个好主意。当您意识到已经存储在十亿个文档中的验证函数需要修改时,您会怎么做?如果某人设法插入带有验证代码的文档会产生更多恶意内容而不仅仅是验证会怎么样?
我真的建议您确定文档的类型以及node.js中每种类型的相应验证例程。
但是当你坚持为文档本身的每个文档提供可执行代码时,可以使用vm.runInContext(object.validator, object) method在node.js中运行该代码。请记住,这需要访问node.js中的整个文档,因此您无法进行部分更新。另外请记住,正如我所说,可能不是一个好主意。
答案 1 :(得分:1)
在即将发布的 Mongo 3.2版中,他们将添加document validation(slides)。
它将以不同的方式工作,并查看您的要求,看起来可以实现您想要的。可以指定字段的类型,检查存在并通过正则表达式。
这里有一些关于验证的内容。您可以使用validator选项为几个所有mongo查询运算符指定验证规则($geoNear
,$near
,$nearSphere
,$text
和{ {1}})。
要使用验证器创建新集合,请使用:
$where
要将验证器添加到现有集合,您可以添加验证器:
db.createCollection("your_coll", {
validator: { `your validation query` }
})
验证仅适用于插入/更新,因此当您在旧集合上创建验证器时,以前的数据将不会被验证(您可以为以前的数据编写应用程序级别验证)。您还可以指定validationLevel和validationAction来说明如果文档无法通过验证会发生什么。
如果您尝试使用未通过验证的内容插入/更新文档(并且未指定任何奇怪的validationLevel / action),那么您将在db.createCollection("your_coll", {
validator: { `your validation query` }
})
上收到错误(遗憾的是,错误无法告诉您你失败了什么,你只得到默认writeResult
):
validation failed