Node.js 在MongoDB文档中存储验证器

Node.js 在MongoDB文档中存储验证器,node.js,mongodb,validation,Node.js,Mongodb,Validation,我希望在Mongo中有一个灵活的模式,但也希望为后续更新强制实施一个模式。是否可以像下面这样将验证存储在文档中? 我已经试过了,但似乎无法将字符串转换为Joi对象 { "_id" : ObjectId("53d5dce1fc87899b2b3c2def"), "name" : { "validator" : "Joi.string().alphanum().min(3).max(30).required()", "value" : "Bob"

我希望在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"
    }
}

大多数情况下,在数据库中存储可执行代码不是一个好主意。当你实现一个已经存储在十亿个需要修改的文档中的验证器功能时,你会怎么做?如果有人试图插入一个带有验证代码的文档,而验证代码比验证代码更具恶意,该怎么办

我真的建议您为node.js中的每种类型确定文档的类型和适当的验证例程


但是,当您坚持在文档本身中为每个文档都提供可执行代码时,您可以在node.js中使用。请记住,这需要访问node.js中的整个文档,因此不能进行部分更新。还要记住,正如我所说,这可能不是一个好主意

大多数时候,在数据库中存储可执行代码不是一个好主意。当你实现一个已经存储在十亿个需要修改的文档中的验证器功能时,你会怎么做?如果有人试图插入一个带有验证代码的文档,而验证代码比验证代码更具恶意,该怎么办

我真的建议您为node.js中的每种类型确定文档的类型和适当的验证例程


但是,当您坚持在文档本身中为每个文档都提供可执行代码时,您可以在node.js中使用。请记住,这需要访问node.js中的整个文档,因此不能进行部分更新。请记住,正如我所说,在即将发布的Mongo3.2版本中,这可能不是一个好主意

它将以不同的方式工作,从您的需求来看,似乎有可能实现您想要的。可以指定字段的类型,检查是否存在并传递正则表达式

这里有一点关于验证。您可以使用几乎所有mongo查询运算符(除了
$geoNear
$near
$nearSphere
$text
,和
$where
)的选项为每个集合指定验证规则

要使用验证器创建新集合,请使用:

db.createCollection("your_coll", {
  validator: { `your validation query` }
})
要将验证器添加到现有集合,可以添加验证器:

db.createCollection("your_coll", {
  validator: { `your validation query` }
})
验证只在insert/update上工作,因此在旧集合上创建验证程序时,不会验证以前的数据(您可以为以前的数据编写应用程序级验证)。您还可以指定并告知如果文档未通过验证会发生什么情况

如果您尝试使用未通过验证的内容插入/更新文档(并且未指定任何奇怪的验证级别/操作),则您将在
writeResult
上收到一个错误(遗憾的是,该错误没有告诉您失败的内容,您只收到默认的
验证未通过
):


在即将发布的Mongo3.2版本中,他们将添加()

它将以不同的方式工作,从您的需求来看,似乎有可能实现您想要的。可以指定字段的类型,检查是否存在并传递正则表达式

这里有一点关于验证。您可以使用几乎所有mongo查询运算符(除了
$geoNear
$near
$nearSphere
$text
,和
$where
)的选项为每个集合指定验证规则

要使用验证器创建新集合,请使用:

db.createCollection("your_coll", {
  validator: { `your validation query` }
})
要将验证器添加到现有集合,可以添加验证器:

db.createCollection("your_coll", {
  validator: { `your validation query` }
})
验证只在insert/update上工作,因此在旧集合上创建验证程序时,不会验证以前的数据(您可以为以前的数据编写应用程序级验证)。您还可以指定并告知如果文档未通过验证会发生什么情况

如果您尝试使用未通过验证的内容插入/更新文档(并且未指定任何奇怪的验证级别/操作),则您将在
writeResult
上收到一个错误(遗憾的是,该错误没有告诉您失败的内容,您只收到默认的
验证未通过
):


您希望在何处(节点、mongodb…)和何时(创建、更新、读取…)进行验证?可能在节点中进行验证,因为我认为这样会更灵活。更新时。您希望在何处(节点、mongodb…)和何时(创建、更新、读取…)进行验证?可能在节点中进行验证,因为我认为这样会更灵活。我不希望我会让任何人编写他们自己的验证器。可能只是选择和配置一打预先存在的。我不期望任何两个文档会完全相同(尽管我相信会有一些重叠),因此很难确定“类型”。@user1074891即使你不希望人们插入他们自己的代码,你也会因为自己的一点编程错误而导致代码注入。您在验证代码中输入的任何用户提供的字符串都可能是一个安全漏洞。您是说使用vm.runInContext时,这种类型的滥用的潜在影响更大,还是您只是一般性地强调了这种风险?@user1074891一般性的风险。我不认为我会让任何人编写自己的验证程序。可能只是选择和配置一打预先存在的。我不期望任何两个文档会完全相同(尽管我确信会有一些重叠),因此很难确定“类型”。@user1074891即使您不希望让人们插入