注册

详解MongoDB的validate_collection()函数:验证集合是否有效

MongoDB是一种文档导向的数据库,它以JSON(JavaScript对象表示法)的格式存储数据。在存储之前,需要定义数据结构和数据验证规则。MongoDB提供了validate_collection()函数,用于检测集合中的文档是否符合指定的验证规则。

函数作用

validate_collection()函数用于验证集合中的每个文档是否符合指定的验证规则。如果某个文档不符合规则,则会显示包含错误信息的结果。如果所有文档符合规则,则返回null值。

使用方法

使用validate_collection()函数需要满足以下条件:
* MongoDB版本>= 3.2
* 需要定义一个具体的文档验证规则(validation rule)。

定义文档验证规则:
验证规则必须包含在create方法中,该方法会在创建集合的同时定义验证规则。

db.createCollection("users", 
   { validator: { $jsonSchema: {
               bsonType : "object",
               required : [ "username", "password" ],
               properties : {
                  username : {
                     bsonType : "string",
                     description : "must be a string and is required"
                  },
                  password : {
                     bsonType : "string",
                     description : "must be a string and is required"
                  }
               }
            } },
       validationLevel: "strict",
       validationAction: "error"
   }
)

在集合中添加文档:

db.users.insert({"username": "tina", "password": "123456"})
db.users.insert({"username": "judy", "password": 123456})

调用validate_collection()函数进行验证:

db.runCommand({validate: "users"})

输出结果:

{
   "ok" : 1,
   "result" : {
       "valid" : true,
       "errors" : [ ]
   }
}

上述输出结果表明,集合中的文档符合定义的验证规则。

示例

下面提供一个更具体的实例:

定义验证规则:
按照上述格式,我们定义一个验证用户账号和密码是否符合要求的文档验证规则,其中,账号必须是字符串类型,长度在1-20之间;密码长度在6-16之间。具体的验证规则如下面代码所示。

db.createCollection("users", 
   { validator: { $jsonSchema: {
               bsonType : "object",
               required : [ "username", "password" ],
               properties : {
                  username : {
                     bsonType : "string",
                     description : "must be a string and is required",
                     minLength: 1,
                     maxLength: 20
                  },
                  password : {
                     bsonType : "string",
                     description : "must be a string and is required",
                     minLength: 6,
                     maxLength: 16
                  }
               }
            } },
       validationLevel: "strict",
       validationAction: "error"
   }
)

在集合中添加文档:

db.users.insert({"username": "t", "password": "123"})
db.users.insert({"username": "test1234567890123456789", "password": "12345"})
db.users.insert({"username": "tina", "password": 1234567})

调用validate_collection()函数进行验证:

db.runCommand({validate: "users"})

输出结果:

{
   "ok" : 1,
   "result" : {
       "valid" : false,
       "errors" : [
           {
               "category" : "validator",
               "code" : 121,
               "message" : "Document failed validation",
               "details" : {
                   "validator" : {
                       "$jsonSchema" : {
                           "bsonType" : "object",
                           "required" : [
                               "username",
                               "password"
                           ],
                           "properties" : {
                               "username" : {
                                   "bsonType" : "string",
                                   "description" : "must be a string and is required",
                                   "minLength" : 1,
                                   "maxLength" : 20
                               },
                               "password" : {
                                   "bsonType" : "string",
                                   "description" : "must be a string and is required",
                                   "minLength" : 6,
                                   "maxLength" : 16
                               }
                           }
                       }
                   },
                   "schema" : {
                       "username" : "string",
                       "password" : "string"
                   },
                   "uri" : "mongodb://localhost:27017/test.users",
                   "bsonType" : "object",
                   "violations" : [
                       {
                           "field" : "username",
                           "message" : "minLength validation failed"
                       },
                       {
                           "field" : "password",
                           "message" : "maxLength validation failed"
                       },
                       {
                           "field" : "password",
                           "message" : "minLength validation failed"
                       },
                       {
                           "field" : "username",
                           "message" : "maxLength validation failed"
                       }
                   ]
               }
           }
       ]
   }
}

上述输出结果表明,集合中的第一和第二文档没有符合规则,出现了两个验证错误:账号长度不够和密码超过了最大长度。第三个记录符合验证规则。