自动加密支持的操作
此页面记录了为自动客户端字段级加密配置的驱动程序支持的特定命令、查询运算符、更新运算符、聚合阶段和聚合表达式。
支持的读写命令
使用自动客户端字段级加密的驱动程序支持以下命令:
对于任何受支持的命令,如果命令使用不受支持的运算符、聚合阶段或聚合表达式,驱动程序将返回错误。有关支持的运算符、阶段和表达式的完整列表,请参阅本页的以下部分:
以下命令不需要自动加密。为自动客户端字段级加密配置的驱动程序将这些命令直接传递给 mongod
:
getMore
[ 1 ]authenticate
getnonce
hello
logout
abortTransaction
commitTransaction
endSessions
startSession
create
createIndexes
drop
dropDatabase
dropIndexes
killCursors
listCollections
listDatabases
listIndexes
renameCollection
ping
通过为自动客户端字段级加密配置的驱动程序发出任何其他命令会返回错误。
虽然自动客户端字段级加密 (CSFLE) 不加密命令 getMore
,但对命令的响应可能包含加密的字段值。
- 配置了正确 CSFLE 选项的应用程序会自动解密这些值。
- 没有正确 CSFLE 选项的应用程序只能看到加密的值。
支持的查询运算符
针对确定性加密字段发出时,为自动客户端字段级加密配置的驱动程序允许使用以下查询运算符:
将加密字段与null
正则表达式进行比较的查询始终会返回错误,即使使用受支持的查询运算符也是如此。针对随机加密字段发出这些运算符的查询会返回错误。
$exists
当针对确定性和随机加密字段发出时,运算符具有正常行为。
针对加密字段指定任何其他查询运算符的查询返回错误。
以下查询运算符即使未针对加密字段发出,也会返回错误:
警告:
BinData 的意外行为
MongoDB 将客户端字段级加密字段存储为
BinData
blob。BinData
与针对解密值发出相同操作相比,针对加密值发出的读取和写入操作可能具有意外或不正确的行为。某些操作具有严格的 BSON 类型支持,其中针对BinData
值发出它们会返回错误。
- 使用自动客户端字段级加密的驱动程序解析不支持
BinData
值 或在针对值发出时具有意外行为的运算符或表达式的读取和写入操作BinData
。- 使用显式(手动)客户端字段级加密的应用程序可以使用此页面作为针对加密字段发出读取和写入操作的指南。
不支持的插入操作
为自动客户端字段级加密配置的驱动程序不支持具有以下行为的插入命令:
Timestamp(0,0)
插入与加密字段关联的文档。该(0,0)
值表示mongod
应该生成时间戳。当mongod
无法生成加密字段时,生成的时间戳是未加密的。_id
如果配置的自动模式指定加密字段,则插入没有加密的文档_id
。当mongod
自动生成未加密的 ObjectId时,_id
从文档中省略会导致文档不符合自动加密规则。- 插入一个文档,其中包含一个与确定性加密字段关联的数组 。自动客户端字段级加密不支持确定性加密数组。
支持的更新操作员
针对确定性加密字段发布时,为自动客户端字段级加密配置的驱动程序允许以下更新操作符:
在加密字段上使用$rename
运算符时,自动 JSON 架构必须为源字段名称和目标字段名称指定相同的加密元数据。
针对加密字段指定任何其他更新运算符的更新返回错误。
即使使用受支持的运算符,具有以下行为的更新操作也会返回错误 :
- 更新操作在加密路径内生成一个数组。
- 更新操作使用聚合表达式语法。
对于在确定性加密字段上指定查询过滤器的更新操作,查询过滤器必须仅使用支持的运营商在那些领域。
支持的聚合阶段
为自动客户端字段级加密配置的驱动程序支持以下聚合管道阶段:
$addFields
$bucket
$bucketAuto
$collStats
$count
$geoNear
$group
(使用要求见$group
行为)$indexStats
$limit
$lookup
和$graphLookup
(有关使用要求,请参阅$lookup
和$graphLookup
行为)$match
$project
$redact
$replaceRoot
$sample
$skip
$sort
$sortByCount
$unwind
在为指定任何其他阶段的自动加密配置的集合上运行的管道返回错误。
对于每个受支持的管道阶段,MongoDB 跟踪 必须加密的字段,因为它们通过受支持的管道并将它们标记为加密。
每个受支持的阶段必须指定仅受支持 查询运算符和 聚合表达式。
$group
行为
$group
具有以下特定于客户端字段级加密的行为:
$group
支持:
$group 不支持:
$lookup
和$graphLookup
行为
自动客户端字段级加密支持$lookup
且 仅当集合与聚合运行所针对的集合匹配时(特别是自查找操作)。$graphLookup
from
$lookup
引用$graphLookup
不同from
集合的阶段返回错误。
支持的聚合表达式
为自动客户端字段级加密配置的驱动程序允许对确定性加密字段使用以下表达式的聚合阶段:
如果针对加密字段发出所有其他聚合表达式,则会返回错误。
即使使用受支持的聚合表达式,具有以下行为的聚合阶段也会返回错误 :
表达式 | 拒绝行为 | 例子 |
---|---|---|
$cond $switch |
该表达式指定一个字段,其加密属性直到运行时才为人所知,并且后续聚合阶段包括引用该字段的表达式。 | $addFields : { "valueWithUnknownEncryption" : { $cond : { if : { "$encryptedField" : "value" }, then : "$encryptedField", else: "unencryptedValue" } }},{ $match : { "valueWithUnknownEncryption" : "someNewValue" }} |
$eq $ne |
该表达式创建一个引用加密字段的新字段,并在同一表达式中对该新字段进行操作。 | { $eq : [ {"newField" : "$encryptedField"}, {"newField" : "value" ]} |
$eq $ne |
该表达式引用比较表达式中加密字段的前缀。 | { $eq : [ "$prefixOfEncryptedField" , "value"] } |
$eq $ne |
表达式的结果与加密字段进行比较。 | { $eq : [ "$encryptedField" , { $ne : [ "field", "value" ] } ]} |
$let |
表达式将变量绑定到加密字段或尝试重新绑定$$CURRENT 。 |
{ $let: { "vars" : { "newVariable" : "$encryptedField" } }} |
$in |
表达式的第一个参数是一个加密字段, 并且表达式的第二个参数不是数组文字-或者-表达式的第二个参数是一个加密字段。 | { $in : [ "$encryptedField" , "$otherEncryptedField" ]} |
不支持的字段类型
为自动客户端字段级加密 (CSFLE) 配置的驱动程序不支持任何需要加密以下值类型的读取或写入操作:
加密没有充分隐藏这些值的类型信息。
自动 CSFLE也不支持对确定性加密字段的读取或写入操作,其中操作将加密字段与以下值类型进行比较:
array
bool
decimal128
double
object
javascriptWithScope
(已弃用)
译者:韩鹏帅