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