我正在使用 mongodb 3.6 并为该students
集合提供以下验证器:
rs1:PRIMARY> db.getCollectionInfos({name: 'students'})
[
{
"name" : "students",
"type" : "collection",
"options" : {
"validator" : {
"$jsonSchema" : {
"properties" : {
"name" : {
"bsonType" : "string",
"description" : "name"
},
"age" : {
"bsonType" : "int",
"minimum" : 10,
"maximum" : 30
}
},
"required" : [
"name",
"age"
],
"bsonType" : "object"
}
},
"validationLevel" : "strict",
"validationAction" : "error"
},
"info" : {
"readOnly" : false,
"uuid" : BinData(4,"111r7z+rQpGoebZ1jAHO4g==")
},
"idIndex" : {
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.students"
}
}
]
它需要两个属性name
和age
。姓名必须是字符串,年龄必须在 10 到 30 之间。但是为什么下面的插入会失败?
rs1:PRIMARY> db.students.insert({age: 11, name: 'Mike'})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
正如我所看到的,您正在
writeError
使用Error code : 121
这样的插件根据
@Jai Hirsch
此处的 MongoDB 博客文档进行 MongoDB 文档验证。有时您想要完全自由格式的文档,有时您不需要。在3.2 release of MongoDB
这个想法中document validation
被介绍了。我过去遇到的一个问题是使用不同的数据类型插入日期。示例:(为简洁起见,使用命令行符号)第一个团队使用数字日期:
第二个团队使用字符串格式:
第三个团队使用 ISO 日期:
导致这个问题的通信问题是另一个故事,但不用说需要大量的数据清理来解决这个问题,因为读取数据的主要应用程序需要一个 ISO 日期。通过使用定义数据库映射对象的共享库解决了代码问题。现在让我们看看如何使用文档验证来解决这个问题。
我们将使用以下命令创建一个集合:
使用验证器创建的集合现在只能使用新的 Date() 格式插入:
数字和字符串插入将给出以下错误:
同样,几乎每个新的开发人员
MongoDB
都会在命令行上犯这个“错误”,例如:有人会认为他们已将包含整数的文档插入
two
到集合中,而实际上该文档现在包含一个浮点值。我可以证明这可能导致的痛苦(特别是如果您使用的是强类型语言,例如
JAVA
)。我们可以使用验证器来防范这种情况:
前面的插入现在将给我们
121 error code
,您需要使用NumberInt constructor
: