Mongodb 使用文档验证程序确保文档中只存在某些密钥
插入文档时,我想使用mongodb文档验证功能检查文档中的所有键是否来自预定义的键集。假设只允许使用“a”、“b”、“c”键,下面定义的doc1和doc2是2个文档: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无效 此外,如果在上述情况下
{
"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这是不可能的。为此,您需要使用第三方工具。