对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

指定现有文档的验证级别

对于在添加验证之前集合中已存在的文档,您可以指定 MongoDB 如何将验证规则应用于这些文档。

您的模式的 validationLevel 决定了 MongoDB 应用验证规则的文档:

validationLevel
行为

moderate

MongoDB将相同的验证规则应用于文档插入,并更新与验证规则匹配的现有有效文档。 对集合中现有文档的更新如果与验证规则不匹配,则无需通过验证。

strict

(默认) MongoDB对所有文档插入和更新应用相同的验证规则。

constraint

MongoDB 将验证规则应用于所有文档插入和更新,并 ACID 一致性保证集合中的每个文档都满足这些规则。与 strict 不同,具有 constraint 验证的集合不能包含在设置级别之前无效的文档。此级别增加了以下限制:

  • 验证操作必须为 error 或 errorAndLog。

  • 当级别为 constraint 时,您无法修改模式验证规则。要更改验证规则,请降级到 strict,修改规则,然后升级回 constraint。

9.0版本新增。

此页面上的示例使用的是 movies 集合。要创建集合并插入示例所使用的文档,请运行以下命令:

db.movies.insertMany( [
{ title: "The Godfather", year: 1972 },
{ title: "Casablanca", year: 1942 }
] )

以下示例将 moderate 验证器添加到 movies 集合中,并插入一个满足验证规则的文档。

1

使用 moderate validationLevel 向 movies 集合添加一个验证器:

db.runCommand( {
collMod: "movies",
validator: { $jsonSchema: {
bsonType: "object",
required: [ "title" ],
properties: {
title: {
bsonType: "string",
description: "title must be a string and is required"
}
}
} },
validationLevel: "moderate"
} )

因为 validationLevel 是 moderate,MongoDB 将验证规则应用于所有文档插入和对已满足规则的现有文档的更新。

2

title以下插入命令添加了一个文档,其中包含一个带有 string 值的字段,这满足了验证规则:

db.movies.insertOne(
{ title: "Wings", year: 1927 }
)
3

由于该文档满足验证规则,因此插入成功。MongoDB 返回类似以下的输出:

{
acknowledged: true,
insertedId: ...
}

以下示例将 strict 验证器添加到 movies 集合中,并插入一个满足验证规则的文档。

1

使用 strict validationLevel 向 movies 集合添加一个验证器:

db.runCommand( {
collMod: "movies",
validator: { $jsonSchema: {
bsonType: "object",
required: [ "title" ],
properties: {
title: {
bsonType: "string",
description: "title must be a string and is required"
}
}
} },
validationLevel: "strict"
} )

由于 validationLevel 为 strict,MongoDB 将验证规则应用于所有文档插入和更新。

2

title以下插入命令添加了一个文档,其中包含一个带有 string 值的字段,这满足了验证规则:

db.movies.insertOne(
{ title: "The Conversation", year: 1974 }
)
3

由于该文档满足验证规则,因此插入成功。MongoDB 返回类似以下的输出:

{
acknowledged: true,
insertedId: ...
}

注意

当您升级到 strict 验证时,MongoDB 不会追溯检查集合中的现有文档是否通过验证器。升级后,集合可能包含升级前就已存在的无效文档。然而,对不合法文档的更新操作会失败,因为验证器的原因。要更新无效文档,首先解决导致验证器失败的问题。

以下示例将 movies 集合升级到 constraint 验证级别。当您升级到 constraint 级别时,MongoDB 会检查集合中已有的每个文档是否满足验证程序。

注意

以下过程适用于已存在的集合。如果您在创建集合时将 validationLevel 设置为 constraint,则无需先将级别设置为 strict 或准备集合。

1

If your collection's validationLevel is not already strict, follow the procedure to specify strict validation.

2

将 prepareConstraintValidationLevel 设置为 true 以运行 collMod:

db.runCommand( {
collMod: "movies",
prepareConstraintValidationLevel: true
} )

此命令通过阻止 bypassDocumentValidation 并防止对验证程序进行更改,为升级做好集合准备。

3

运行 collMod 以将 validationLevel 设置为 constraint。validationAction 必须是 error 或 errorAndLog:

db.runCommand( {
collMod: "movies",
validationLevel: "constraint",
validationAction: "error"
} )

您无法在将 validationLevel 升级到 constraint 的同一 collMod 操作中更改 validator。在运行此命令之前,请设置验证规则。要在以后更改规则,将级别降级到 strict,修改规则,然后再升级回 constraint。

由于 validationLevel 为 constraint,MongoDB 会将验证规则应用于所有文档插入和更新,无论现有文档在升级前是否符合这些规则。

当您将级别设置为 constraint 时,MongoDB 会扫描集合中的所有现有文档,如果任何文档违反了验证程序,则会使 collMod 操作失败。对于大型集合,此扫描的计算成本可能很高。如果操作失败,请在继续之前更新违规文档以通过验证程序。

4

title以下插入命令添加了一个文档,其中包含一个带有 string 值的字段,这满足了验证规则:

db.movies.insertOne(
{ title: "Sunrise", year: 1927 }
)
5

由于该文档满足验证规则,因此插入成功。MongoDB 返回类似以下的输出:

{
acknowledged: true,
insertedId: ...
}

重要

错误输出供人类使用。它将来可能会更改,不应在脚本中依赖它。