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

Queryable Encryption 的支持操作

本页记录了可查询Queryable Encryption兼容驱动程序支持的特定数据类型、命令、查询操作符、更新操作符、聚合阶段和聚合表达式。 它概述了使用自动加密的操作和使用显式加密的操作的行为。

注意

Enterprise 版功能

MongoDB Enterprise 和 MongoDB Atlas 提供自动加密

MongoDB将可Queryable Encryption加密字段存储为BinData blob。 与对解密值发出相同操作相比,对加密BinData值发出读取和写入操作可能会出现意外或不正确的行为。 某些操作具有严格的BSON类型支持,如果针对BinData值发出这些操作会返回错误。

与可Queryable Encryption兼容的官方驱动程序会解析不支持BinData值的运算符或表达式的写入操作。

您可以为字段加密的 BSON types 取决于该字段的 查询类型。

Queryable Encryption 支持 配置queryType: "equality" 除以下 BSON types 之外的所有 :

  • array

  • decimal:十进制(IEEE 754十进制128 )

  • double: double (IEEE 754二进制64)

  • object

Queryable Encryption 支持配置以下 BSON types:的 queryType: "range"

  • date:UTC DateTime (Int 64 )

  • decimal:十进制(IEEE 754十进制128 )

  • double: double (IEEE 754二进制64)

  • int: 32位整数

  • long: 64位整数

注意

查询类型是加密索引的配置,而不是查询操作符本身。特别是,decimal 和 double 支持 queryType: "range",MongoDB 使用范围索引对这些字段上的相等查询进行评估。

Queryable Encryption 仅支持为 string BSON 类型配置 queryType: "prefix"、queryType: "suffix" 和 queryType: "substring"。

如果设置 queryType: "none",MongoDB 会加密该字段,但不会使其可查询。Queryable Encryption 支持所有 BSON types 的 queryType: "none",但下文列出的 不受支持的 BSON types 除外,包括 array 和 object。

无论查询类型如何,Queryable Encryption 都不支持加密以下 BSON types,因为它无法充分隐藏这些值的类型信息:

如果查询类型为 none,Queryable Encryption 支持对 array 字段进行自动和显式加密。您可以加密数组,但不能加密其中的字段,并且无法查询加密的数组。

Queryable Encryption 不支持对加密字段执行将加密字段与以下值类型进行比较的读取或写入操作:

  • array

  • object

  • Queryable Encryption不支持多文档更新或删除操作。 不支持执行多个更新或删除操作的db.collection.updateMany()和db.collection.bulkWrite() 。

  • Queryable Encryption 批量写入操作只能针对一个命名空间。如果 bulkWrite 命令在 nsInfo 中指定了多个命名空间,则该操作会返回错误。

  • Queryable Encryption限制db.collection.findAndModify()参数。

    • fields 不允许

    • new 必须为 false

  • 执行更新或插入操作时,过滤器中的任何加密字段都将从插入中排除。

Queryable Encryption兼容的驱动程序支持使用以下命令进行自动加密:

对于任何受支持的命令,如果该命令使用了不支持的操作符、聚合阶段或聚合表达式,驱动程序都会返回错误。 有关支持的操作符、阶段和表达式的完整列表,请参阅以下部分:

以下命令不需要自动加密。 配置为自动加密的官方驱动程序会将这些命令直接传递给mongod :

通过配置为自动加密的兼容驱动程序发出任何其他命令都会返回错误。

[1]

虽然自动加密不会加密 getMore 命令,但对该命令的响应可能包含加密的字段值。

  • 配置了正确的 Queryable Encryption 选项的应用程序会自动解密这些值。

  • 没有正确加密选项的应用程序会看到加密值。

配置为自动加密的驱动程序在针对加密的可查询字段发布时,支持一设立有限的查询运算符。

使用受支持的查询类型查询非加密字段或加密字段会返回加密数据,然后在客户端对这些数据进行解密。

Queryable Encryption目前支持以下查询类型:

  • none

  • equality

  • range

  • prefix

  • suffix

  • substring

如果未指定查询类型,则默认为 none。如果查询类型为 none, MongoDB会对该字段进行加密,客户端无法对其查询。

重要

比较支持

支持将加密字段与明文值进行比较。

{$expr: {$eq: ["$encrypted1", "plaintext_value"]}}

将一个加密字段与另一个加密字段进行比较将失败。

{$expr: {$eq: ["$encrypted1", "$encrypted2"]}}

为queryType: "equality"配置的字段支持以下表达式:

范围查询会将相等查询隐式转换为 $lte 和 $gte。因此,为 queryType: "range" 配置的字段支持上述所有表达式以及以下表达式:

针对加密字段指定任何其他查询操作符的查询将会返回错误。

即使使用支持的查询运算符,将加密字段与null或正则表达式进行比较的查询也始终会引发错误。

使用为Queryable Encryption配置的 MongoClient 时,即使针对未加密的字段发出以下查询运算符,也会引发错误:

配置为自动加密的驱动程序在针对加密字段发布时支持以下更新操作符:

针对加密字段指定任何其他更新操作符的更新会返回错误。

即使使用支持的操作符,具有以下行为的更新操作也会引发错误:

  • 更新操作在加密路径内生成一个数组。

  • 更新操作使用聚合表达式语法。

对于在加密字段上指定查询筛选器的更新操作,查询筛选器必须仅使用这些字段支持的操作符。

支持替换式更新,但如果替换文档的顶级加密字段中包含Timestamp(0,0) ,Queryable Encryption 将出错。 (0,0)值指示mongod应生成时间戳。 mongod无法生成加密字段。

配置为自动加密的兼容驱动程序不支持具有以下行为的插入命令:

  • 插入具有与加密字段关联的Timestamp(0,0)的文档。 (0,0)值指示mongod应生成时间戳。 由于mongod无法生成加密字段,因此生成的时间戳将是未加密的。

自动加密不支持读取或写入其他collection的聚合阶段。这些阶段是:

为自动加密配置的兼容驱动程序支持以下聚合管道阶段:

对配置为自动加密的collection进行操作,如果指定任何其他阶段,则管道会返回错误。

注意

对于配置为使用 Queryable Encryption 进行自动加密的客户端,不支持 $rerank 阶段。包含 $rerank 的管道会失败,并出现类似 Unrecognized pipeline stage name: '$rerank' 的错误。

此限制适用于所有集合,包括没有加密字段的集合,以及在子管道(例如 $unionWith)中使用 $rerank 的情况。

对于每个支持的管道阶段,MongoDB 都会在字段通过支持的管道时对必须加密的字段进行追踪,并标记为加密字段。

每个受支持的阶段必须只指定受支持的查询操作符和聚合表达式。

从MongoDB 8.1 开始,您可以在 $lookup 阶段引用多个加密集合。但是,$lookup 不支持:

  • 使用加密字段作为 localField 或 foreignField 中的联接字段。

  • 使用加密大量中的任何字段。如果大量包含任何加密元素,则视为加密。

    • 示例,您不能使用 $lookup 操作生成的 as 数组中的任何字段。

仅当$graphLookup 集合与聚合的集合匹配时,自动加密才支持from 。引用不同 from集合的$graphLookup 阶段会返回错误。

自动加密不支持“无连接”聚合元数据源,此类源会读取不属于特定集合的元数据,例如:

自动加密不支持$planCacheStats阶段,因为结果可能包含敏感信息。

配置为自动加密的兼容驱动程序支持针对为相等查询配置的加密字段的以下表达式:

配置为自动加密的兼容驱动程序支持针对为 prefix、suffix 或 substring 查询配置的加密字段的以下表达式:

如果对加密字段执行操作,则所有其他聚合表达式都会返回错误。

即使使用支持的聚合表达式,具有以下行为的聚合阶段也会返回错误:

表达式
已拒绝行为
例子

该表达式指定一个字段,其加密属性在运行时之前不可知,并且后续聚合阶段包括引用该字段的表达式。

$addFields : { "valueWithUnknownEncryption" : { $cond : { if : { "$encryptedField" : "value" }, then : "$encryptedField", else: "unencryptedValue" } }},{ $match : { "valueWithUnknownEncryption" : "someNewValue" }}

该表达式会创建一个引用加密字段的新字段,并在同一表达式中对该新字段进行操作。

{ $eq : [ {"newField" : "$encryptedField"}, {"newField" : "value" ]}

该表达式引用比较表达式中加密字段的前缀。

{ $eq : [ "$prefixOfEncryptedField" , "value"] }

将表达式的结果与加密字段进行比较。

{ $eq : [ "$encryptedField" , { $ne : [ "field", "value" ] } ]}

该表达式将变量绑定到加密字段或尝试重新绑定 $$CURRENT。

{ $let: { "vars" : { "newVariable" : "$encryptedField" } }}

表达式的第一个参数是加密字段,并且

  • 表达式的第二个参数不是数组文本

    -或-

  • 表达式的第二个参数是加密字段。

{ $in : [ "$encryptedField" , "$otherEncryptedField" ]}