在插入文档时,我想使用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中的文档验证功能来完成
答案 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",
},
}
}
}
});
情侣笔记可能会有所帮助:
_id
时,您必须拥有additionalProperties: false
条目,否则每个文档都将无法通过验证。additionalProperties: false
条目都需要bsonType: "object"
,否则该嵌套对象将允许其上的任何其他属性。文档链接:
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"
})
这将接受这些文件
不接受这些文件
答案 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已分配了一个问题。