MST

星途 面试题库

面试题:MongoDB插入文档校验机制基础

请阐述MongoDB默认的插入文档校验机制,以及如何利用JSON Schema在MongoDB中进行简单的文档校验?
16.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

MongoDB默认插入文档校验机制

  1. 无严格模式:MongoDB 默认情况下,插入文档时不会对文档结构进行严格校验。只要文档是符合 BSON(Binary JSON)格式的,就可以成功插入。这意味着即使集合中的文档结构不一致,也能顺利插入。例如,在一个存储用户信息的集合中,可能有的文档包含 nameage 字段,而有的文档只有 name 字段,都可以插入。
  2. 类型检查:虽然不严格校验文档结构,但 MongoDB 会对某些数据类型进行基本检查。例如,你不能将一个字符串值插入到期望为数字类型的字段位置(在进行某些操作,如比较或算术运算时会体现出类型要求)。

利用JSON Schema在MongoDB中进行简单文档校验

  1. 启用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的整数且是必填字段"
                }
            }
        }
    }
});
  1. 插入文档校验:当按照上述方式设置好 JSON Schema 校验规则后,插入文档时 MongoDB 会根据此规则进行校验。如果插入的文档不符合 JSON Schema 定义,将会抛出错误,插入操作失败。例如,尝试插入一个缺少 age 字段的文档:
db.users.insertOne({name: "John"});
// 将会抛出类似如下错误:
// WriteError({
//     "index" : 0,
//     "code" : 121,
//     "errmsg" : "Document failed validation"
// })
  1. 更新文档校验:对于更新操作,如果更新后的文档不符合 JSON Schema 定义,更新也会失败。例如,尝试将 age 字段更新为非数字值:
db.users.updateOne({name: "John"}, {$set: {age: "twenty"}});
// 同样会抛出错误,因为更新后不符合JSON Schema中对`age`字段类型的定义

通过这种方式,利用 JSON Schema 可以在 MongoDB 中实现对文档的结构化和类型校验,确保集合中的文档具有一定的规范性。