如何在Mongo中使用Json模式验证Json文件?

时间:2018-01-05 14:56:10

标签: json mongodb jsonschema

我有一个JSON文件,我想在MongoDB上使用JSON Schema验证该文件。 如何将JSON架构导入MongoDB,然后验证JSON文件。 JSON文件已经在一个集合中,所以我想验证而不导入新的JSON文件。

JSON:

{
"Book": {
    "Year:2016-2017": {
        "Crs": [{
            "Cr": {
                "_id": {
                    "$oid": "5a439ff4fc0900f06fb470a4"
                },
                "Number": 35,
                "Pag": 8,
                "Desc": "Embl",
                "Ad": "S",
                "Type": "Embl"
            }
        }]
    }
}

}

JSON架构:

{
"type": "object",
"$schema": "http://json-schema.org/draft-03/schema",
"id": "http://jsonschema.net",
"required": false,
"properties": {"Book": {
    "type": "object",
    "id": "http://jsonschema.net/Book",
    "required": false,
    "properties": {"Year:2016-2017": {
        "type": "object",
        "id": "http://jsonschema.net/Book/Year:2016-2017",
        "required": false,
        "properties": {"Crs": {
            "type": "array",
            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs",
            "required": false,
            "items": {
                "type": "object",
                "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0",
                "required": false,
                "properties": {"Cr": {
                    "type": "object",
                    "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr",
                    "required": false,
                    "properties": {
                        "Ad": {
                            "type": "string",
                            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/Ad",
                            "required": false
                        },
                        "Desc": {
                            "type": "string",
                            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/Desc",
                            "required": false
                        },
                        "Number": {
                            "type": "number",
                            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/Number",
                            "required": false
                        },
                        "Pag": {
                            "type": "number",
                            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/Pag",
                            "required": false
                        },
                        "Type": {
                            "type": "string",
                            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/Type",
                            "required": false
                        },
                        "_id": {
                            "type": "object",
                            "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/_id",
                            "required": false,
                            "properties": {"$oid": {
                                "type": "string",
                                "id": "http://jsonschema.net/Book/Year:2016-2017/Crs/0/Cr/_id/$oid",
                                "required": false
                            }}
                        }
                    }
                }}
            }
        }}
    }}
}}}

我想使用mongodb的模式验证JSON。

1 个答案:

答案 0 :(得分:4)

  

JSON文件已经在一个集合中,因此我想在不导入新的JSON文件的情况下进行验证。

从MongoDB v3.6.x开始,document schema validation仅在更新和插入期间发生,现有文档在修改之前不会进行验证检查。这意味着MongoDB集合中的现有JSON文档将不会被您刚刚应用的验证规则验证。

请注意,$jsonSchema operatorJSON-SCHEMA支持是MongoDB 3.6版中的新功能。

  

我想添加一个新的“Cr”,但它需要尊重JSON Schema。(插入/更新)

在集合上指定文档架构验证后,任何更新操作都将触发对受影响文档的验证检查。

例如,如果您在集合中有现有文档,如下所示:

{
  "_id": 1,
  "a": {
    "b": {
      "crs": [
        {
          "cr": {
            "d": 2,
            "e": "two"
          }
        }
      ]
    }
  }
}

如果您然后应用如下验证器:

// Validator for nested array of objects.  
var schema = {
  "type": "object",
  "properties": {
     "a": {
        "type": "object",
        "properties": {
            "b": {
                "type": "object",
                "properties": {
                    "crs": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "cr": {
                                    "type": "object",
                                    "properties": {
                                        "d": {
                                            "bsonType": "int",
                                        },
                                        "e": {
                                            "type": "string",
                                        }
                                    }
                            }}
                        }
                }}
        }}
}}}
db.runCommand({"collMod": "collectionName", 
               "validator": { "$jsonSchema": schema}}
);    

更新现有文档以添加新cr时,将验证整个文档。

db.collectionName.update({_id: 1}, {"$push":{
                                       "a.b.crs":{
                                            "cr":{
                                               "d": NumberInt(20),
                                               "e": "new element"}}}
});

根据您的文档架构验证规则无效的任何预先存在的文档,您必须先更正文档,然后再更新它们。