可查询加密的支持操作
本页内容
本页记录了与可查询加密兼容的驱动程序支持的特定数据类型、命令、查询运算符、更新运算符、聚合阶段和聚合表达式。它概述了使用自动加密的操作和使用显式加密的操作的行为。
注意
企业功能
自动加密在 MongoDB 企业版和 MongoDB Atlas 中可用
使用以下操作BinData
MongoDB 将可查询加密加密字段存储为BinData
块。针对加密的 BinData
值发出的读和写操作可能与针对解密值执行相同操作的行为不同或错误。某些操作具有严格的 BSON 类型支持,在针对 BinData
值发出时返回错误。
与可查询加密兼容的官方驱动程序解析不支持 BinData
值的运算符或表达式的读和写操作。
支持的和不支持的 BSON 类型
可查询加密支持对所有以下BSON 类型的相等查询,除了以下类型:
double
decimal128
object
array
可查询加密支持以下BSON 类型的范围内查询:
int
:32位整数long
:64位整数double
:双精度浮点数(IEEE 754 Binary64)decimal
:十进制数(IEEE 754 Decimal128)date
:UTC 日期时间(Int64)
CRUD
可查询加密不支持多文档更新或删除操作。《a class="leafygreen-ui-tqgtui" href="/docs/manual/reference/method/db.collection.updateMany/#mongodb-method-db.collection.updateMany">
db.collection.updateMany()
和db.collection.bulkWrite()
中包含多个更新或删除操作不被支持。可查询加密限制了
db.collection.findAndModify()
参数。fields
不被允许new
必须为 false
执行更新操作时,过滤器中任何加密的字段都会从插入中排除。
支持的读写命令
可查询加密兼容驱动支持以下命令的自动加密:
对于任何受支持的命令,如果命令使用了不受支持的运算符、聚合阶段或聚合表达式,驱动程序将返回错误。有关受支持运算符、阶段和表达式的完整列表,请参阅以下章节
以下命令不需要自动加密。配置为自动加密的官方驱动程序将直接将这些命令传递给 mongod
:
通过配置为自动加密的兼容驱动程序发出任何其他命令将返回错误。
[1] | 虽然自动加密不加密getMore命令,但命令的响应可能包含加密的字段值。
|
支持的查询运算符
配置为自动加密的驱动程序在针对加密的可查询字段发出查询时支持有限的查询运算符集。
查询非加密字段或使用受支持的查询类型查询加密字段将返回加密数据,然后在客户端进行解密。
可查询加密目前支持 none
、equality
和 range
查询类型。如果未指定查询类型,则默认为 none
。如果查询类型为 none
,则字段被加密,客户端无法查询它。
重要
比较支持
支持将加密字段与明文值进行比较。
{$expr: {$eq: ["$encrypted1", "plaintext_value"]}}
将一个加密字段与另一个加密字段进行比较将失败。
{$expr: {$eq: ["$encrypted1", "$encrypted2"]}}
配置为 queryType: "equality"
的字段支持以下表达式
为 queryType: "range"
配置的字段支持以下表达式
针对加密字段使用任何其他查询运算符的查询将返回错误。
不受支持的查询
将加密字段与 null
或正则表达式进行比较的查询始终会抛出错误,即使使用受支持的查询运算符。
在使用为可查询加密配置的 MongoClient 时,以下查询运算符将抛出错误,即使是对未加密字段发出的
受支持的更新运算符
配置为自动加密的驱动程序在针对加密字段发出时支持以下更新运算符
指定任何其他更新运算符对加密字段的更新将返回错误。
以下行为的更新操作将抛出错误,即使使用受支持的运算符
更新操作在加密路径内生成数组。
更新操作使用聚合表达式语法。
替换式更新
支持替换式更新,但是,如果替换文档中包含顶级加密字段内的 Timestamp(0,0)
,可查询加密将出现错误。值 (0,0)
表示 mongod
应生成时间戳。由于 mongod
无法生成加密字段,因此生成的时间戳将是未加密的。
以下不支持插入操作
配置为自动加密的兼容驱动程序不支持以下行为的插入命令
不支持聚合阶段
自动加密不支持从或写入额外集合的聚合阶段。这些阶段包括
支持的聚合阶段
支持自动加密的兼容驱动程序配置了以下聚合管道阶段
$group
在未加密字段上$lookup
和$graphLookup
(有关使用要求,请参阅$lookup
和$graphLookup
Behavior)
在配置为自动加密的集合上操作且指定了任何其他阶段的聚合管道将返回错误。
对于每个支持的管道阶段,MongoDB 会跟踪必须在通过支持的管道时加密的字段,并为其标记加密。
每个支持的阶段必须仅指定受支持的 查询运算符 和 聚合表达式。
$lookup
和 $graphLookup
行为
自动加密仅支持当 from
集合与聚合运行的集合相匹配时 $lookup
和 $graphLookup
。引用不同 from
集合的 $lookup
和 $graphLookup
阶段将返回错误。
自动加密不支持“无连接”聚合元数据源,它读取不涉及特定集合的元数据,例如
更改流用于监视数据库或整个集群
自动加密不支持 $planCacheStats
阶段,因为结果可能包含敏感信息。
您无法从启用了可查询加密的 MongoClient
对未加密的集合执行 $lookup
。
支持的聚合表达式
配置了自动加密支持的兼容驱动程序支持以下表达式对任何加密字段的等值查询类型
其他所有聚合表达式在针对加密字段发出时返回错误。
以下行为返回错误的聚合阶段,即使使用受支持的聚合表达式
表达式 | 拒绝的行为 | 示例 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
表达式指定一个字段,其加密属性直到运行时才能知道,并且后续的聚合阶段包含引用该字段的表达式。 |
| |||||||||||||||
表达式创建一个引用加密字段的新字段,并在同一个表达式中操作该新字段。 |
| |||||||||||||||
表达式在比较表达式中引用加密字段的子串。 |
| |||||||||||||||
将表达式的结果与加密字段进行比较。 |
| |||||||||||||||
将变量绑定到加密字段,或尝试重新绑定 $$CURRENT . |
| |||||||||||||||
表达式的前一个参数是加密字段,并且
|
|
不支持的字段类型
配置了自动加密的驱动程序不支持任何需要加密以下值类型的读取或写入操作
可查询加密未能充分隐藏这些值的数据类型信息。
可查询加密不支持在文档数组内的字段上进行自动加密。
可查询加密不支持在加密字段上执行读取或写入操作,其中操作会将加密字段与以下值类型进行比较
array
decimal128
double
object