面试题答案
一键面试MongoDB默认插入文档校验机制
- 无严格模式:MongoDB 默认情况下,插入文档时不会对文档结构进行严格校验。只要文档是符合 BSON(Binary JSON)格式的,就可以成功插入。这意味着即使集合中的文档结构不一致,也能顺利插入。例如,在一个存储用户信息的集合中,可能有的文档包含
name
和age
字段,而有的文档只有name
字段,都可以插入。 - 类型检查:虽然不严格校验文档结构,但 MongoDB 会对某些数据类型进行基本检查。例如,你不能将一个字符串值插入到期望为数字类型的字段位置(在进行某些操作,如比较或算术运算时会体现出类型要求)。
利用JSON Schema在MongoDB中进行简单文档校验
- 启用JSON Schema校验:从 MongoDB 4.2 版本开始,支持使用 JSON Schema 进行文档校验。首先,需要在创建集合时设置
validator
选项,并指定$jsonSchema
关键字。例如,使用mongo
shell 创建一个集合并设置校验规则:
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "age"],
properties: {
name: {
bsonType: "string",
description: "必须是字符串且是必填字段"
},
age: {
bsonType: "int",
minimum: 0,
description: "必须是大于等于0的整数且是必填字段"
}
}
}
}
});
- 插入文档校验:当按照上述方式设置好 JSON Schema 校验规则后,插入文档时 MongoDB 会根据此规则进行校验。如果插入的文档不符合 JSON Schema 定义,将会抛出错误,插入操作失败。例如,尝试插入一个缺少
age
字段的文档:
db.users.insertOne({name: "John"});
// 将会抛出类似如下错误:
// WriteError({
// "index" : 0,
// "code" : 121,
// "errmsg" : "Document failed validation"
// })
- 更新文档校验:对于更新操作,如果更新后的文档不符合 JSON Schema 定义,更新也会失败。例如,尝试将
age
字段更新为非数字值:
db.users.updateOne({name: "John"}, {$set: {age: "twenty"}});
// 同样会抛出错误,因为更新后不符合JSON Schema中对`age`字段类型的定义
通过这种方式,利用 JSON Schema 可以在 MongoDB 中实现对文档的结构化和类型校验,确保集合中的文档具有一定的规范性。