Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 使用文档验证程序确保文档中只存在某些密钥_Mongodb - Fatal编程技术网

Mongodb 使用文档验证程序确保文档中只存在某些密钥

Mongodb 使用文档验证程序确保文档中只存在某些密钥,mongodb,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文档验证功能检查文档中的所有键是否来自预定义的键集。假设只允许使用“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中的文档验证功能来实现,请查看以下功能是否可以帮助您:-

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;
    }
  }
}
调用此函数,如
var valid=validateReq(doc1),然后再执行插入

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


希望这会有帮助

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

  • 强制属性(文档必须具有这些属性)
  • 禁止的属性(文件不得有这些属性,必须是特定的)
  • 可选属性
验证程序使用查询,因此您只能显式定义禁止的属性,但不能限制为“仅限这些”。搜索时,将使用无法在验证中使用的投影

强制要求

一个是曼德拉

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}->e是允许的,因为a和b完全填充验证
这些文件不被接受

  • {a:1,d:1}->d是禁止的
  • {a:1,e:1}->b或c不满足
  • {a:1,b:1,d:1}->d是禁止的

实际上,不可能只允许文档中的给定字段。但是,您可以要求某些字段必须使用MongoDB 3.2中的新功能或类似功能显示:

db.createCollection( "collection", 
   { "validator": { 
       "$and": [         
           { "a": { "$exists": true } },         
           { "b": { "$exists": true } }, 
           { "c": { "$exists": true } } 
       ]
    }}
)
此外,除非将
validationLevel设置为“中等”
,否则不能插入或更新不符合验证标准的文档


我认为如果MongoDB允许为新文档设置默认值就好了。现在有一个分配给新功能的问题。

这在Mongo 3.6中可以使用JSON模式验证,如下所示:

db.createCollection("myCollection", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      additionalProperties: false,
      properties: {
        _id: {
          bsonType: 'objectId',
        },
        a: {
          bsonType: "string",
        },
        b: {
          bsonType: "string",
        },
      }
    }
  }
});
以下几点可能会有所帮助:

  • 使用
    additionalProperties:false
    时,始终必须为
    \u id
    设置一个条目,否则每个文档都将无法通过验证
  • 如果架构中有嵌套对象,则需要在每个
    bsonType:“object”
    条目上设置
    additionalProperties:false
    ,否则嵌套对象将允许在其上设置任何附加属性
  • 文档链接:


    您的客户端api是什么?如果是nodejs,您可以使用moogoose框架为集合定义模式?使用MongoDB 3.2中的文档验证可以得到的最好结果是要求所有键都必须存在,在这种情况下,“doc1”也是无效的。这就是你想要的吗?@user3100115我需要两个验证器,第一种情况下doc1是有效的,第二种情况如你所述,但必须不存在额外的密钥问题是存在无限密钥,所以我问有没有办法定义除已定义密钥外的所有内容都是禁止的Denno,这在文档验证中是不可能的(这可能是您的问题的答案),但是在这种情况下,如果任何文档具有除a、b、c之外的密钥,那么它也会验证不存在的文档desired@tpnsharma这是不可能的。为此,您需要使用第三方工具。