确保使用文档验证程序仅在文档中存在某些键

时间:2016-06-07 08:43:03

标签: mongodb

在插入文档时,我想使用mongodb文档验证功能检查文档中存在的所有键都来自一组预定义的键。仅假设" a"," b"," c"是允许的密钥,下面定义的doc1和doc2是2个文件:

{
    "a": "any_value",
    "b":"any_other_value"
},
{
    "a": "any_value",
    "b": "any_other_value",
    "d": "other_value"
}

在这种情况下,doc1是有效文档,doc2无效。

此外,如果在上述情况下又添加了一个必须存在所有密钥的条件,如何进行此验证?

注意:我想知道这是否可以通过MongoDB 3.2中的文档验证功能来完成

4 个答案:

答案 0 :(得分:1)

现在可以在Mongo 3.6中使用JSON Schema验证,如下所示:

db.createCollection("myCollection", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      additionalProperties: false,
      properties: {
        _id: {
          bsonType: 'objectId',
        },
        a: {
          bsonType: "string",
        },
        b: {
          bsonType: "string",
        },
      }
    }
  }
});

情侣笔记可能会有所帮助:

  1. 使用_id时,您必须拥有additionalProperties: false条目,否则每个文档都将无法通过验证。
  2. 如果您的架构中有嵌套对象,则每个additionalProperties: false条目都需要bsonType: "object",否则该嵌套对象将允许其上的任何其他属性。
  3. 文档链接:

    https://docs.mongodb.com/manual/core/schema-validation/ https://docs.mongodb.com/manual/reference/operator/query/jsonSchema/

答案 1 :(得分:0)

查看以下功能是否可以为您提供帮助: -

WebRTC

在插入之前调用此函数,如function validateReq(obj) { var prop = ['a','b','c'] //Add more property name here var found = false; for(var key in obj) { if (prop[key] && (prop[key] !== null)) { found = true; } else { return false; } } }

如果为true,则表示您传递的对象中存在所有有效字段。现在你可以插入。否则,对象中存在一些无效字段。

希望这会有所帮助!!

答案 2 :(得分:0)

使用MongoDB文档验证,您可以表达以下内容

  • 强制性属性(文件必须有这些)
  • 禁止的属性(文件不得有这些,必须具体)
  • 可选属性

验证器使用查询,因此您只能显式定义禁止的属性,但不能限制为“仅限这些”。搜索时,您将使用无法在验证中使用的投影。

<强>强制性

a is mandotry

db.runCommand({
  collMod: "example", 
  validator:{ $and : [ {a:{$exists:1}}] }, 
  validationLevel:"strict", 
  validationAction: "error"
})

<强>禁止

d被禁止

db.runCommand({
  collMod: "example", 
  validator:{ $and : [ {b:{$exists:0}}] }, 
  validationLevel:"strict", 
  validationAction: "error"
})

<强>可选: a是强制性的 b是可选的

db.runCommand({
  collMod: "example", 
  validator:{ 
   $and : [ 
     {a:{$exists:1}},  //mandatory
     {d:{$exists:0}},  //forbidden
     {$or:[
      {b:{$exists:1}}, //optional
      {c:{$exists:1}}]} ] }, 
  validationLevel:"strict", 
  validationAction: "error"
 })

这将接受这些文件

  • {A:1}
  • {a:1,b:1}
  • {a:1,c:1}
  • {a:1,b:1,c:1}
  • {a:1,b:1,e:1} - &gt; e是允许的,因为a和b完全填写验证

不接受这些文件

  • {a:1,d:1} - &gt; d被禁止
  • {a:1,e:1} - &gt; b或c不满意
  • {a:1,b:1,d:1} - &gt; d被禁止

答案 3 :(得分:0)

实际上,不可能只允许文档中的给定字段。但您可以要求使用MongoDB 3.2中的document validation新功能以及$and这样的某些字段:

db.createCollection( "collection", 
   { "validator": { 
       "$and": [         
           { "a": { "$exists": true } },         
           { "b": { "$exists": true } }, 
           { "c": { "$exists": true } } 
       ]
    }}
)

此外,除非设置validationLevel: "moderate",否则无法插入或更新不符合验证条件的文档。

我认为如果MongoDB允许为新文档设置默认值会很好。现在,新功能SERVER-24430已分配了一个问题。