自动加密支持的操作

此页面记录了为自动客户端字段级加密配置的驱动程序支持的特定命令、查询运算符、更新运算符、聚合阶段和聚合表达式。

支持的读写命令

使用自动客户端字段级加密的驱动程序支持以下命令:

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

以下命令不需要自动加密。为自动客户端字段级加密配置的驱动程序将这些命令直接传递给 mongod

通过为自动客户端字段级加密配置的驱动程序发出任何其他命令会返回错误。

虽然自动客户端字段级加密 (CSFLE) 不加密命令 getMore,但对命令的响应可能包含加密的字段值。

  • 配置了正确 CSFLE 选项的应用程序会自动解密这些值。
  • 没有正确 CSFLE 选项的应用程序只能看到加密的值。

支持的查询运算符

针对确定性加密字段发出时,为自动客户端字段级加密配置的驱动程序允许使用以下查询运算符:

将加密字段与null正则表达式进行比较的查询始终会返回错误,即使使用受支持的查询运算符也是如此。针对随机加密字段发出这些运算符的查询会返回错误。

$exists当针对确定性和随机加密字段发出时,运算符具有正常行为。

针对加密字段指定任何其他查询运算符的查询返回错误。

以下查询运算符即使未针对加密字段发出,也会返回错误:

警告:

BinData 的意外行为

MongoDB 将客户端字段级加密字段存储为 BinDatablob。BinData与针对解密值发出相同操作相比,针对加密值发出的读取和写入操作可能具有意外或不正确的行为。某些操作具有严格的 BSON 类型支持,其中针对BinData值发出它们会返回错误。

  • 使用自动客户端字段级加密的驱动程序解析不支持BinData在针对值发出时具有意外行为的运算符或表达式的读取和写入操作BinData
  • 使用显式(手动)客户端字段级加密的应用程序可以使用此页面作为针对加密字段发出读取和写入操作的指南。

不支持的插入操作

为自动客户端字段级加密配置的驱动程序不支持具有以下行为的插入命令:

  • Timestamp(0,0)插入与加密字段关联的文档。该(0,0)值表示 mongod应该生成时间戳。当 mongod无法生成加密字段时,生成的时间戳是未加密的。
  • _id 如果配置的自动模式指定加密字段,则插入没有加密的文档_id。当 mongod自动生成未加密的 ObjectId时,_id从文档中省略会导致文档不符合自动加密规则。
  • 插入一个文档,其中包含一个与确定性加密字段关联的数组 。自动客户端字段级加密不支持确定性加密数组。

支持的更新操作员

针对确定性加密字段发布时,为自动客户端字段级加密配置的驱动程序允许以下更新操作符:

在加密字段上使用$rename运算符时,自动 JSON 架构必须为源字段名称和目标字段名称指定相同的加密元数据。

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

即使使用受支持的运算符,具有以下行为的更新操作也会返回错误 :

对于在确定性加密字段上指定查询过滤器的更新操作,查询过滤器必须仅使用支持的运营商在那些领域。

支持的聚合阶段

为自动客户端字段级加密配置的驱动程序支持以下聚合管道阶段:

在为指定任何其他阶段的自动加密配置的集合上运行的管道返回错误。

对于每个受支持的管道阶段,MongoDB 跟踪 必须加密的字段,因为它们通过受支持的管道并将它们标记为加密。

每个受支持的阶段必须指定仅受支持 查询运算符聚合表达式。

$group行为

$group具有以下特定于客户端字段级加密的行为:

$group支持:

  • 对确定性加密字段进行分组。
  • 在加密字段上使用$addToSet$push累加器。

$group 不支持:

  • $addToSet匹配由和 累加器返回的数组 $push
  • 加密字段上的算术累加器。

$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 (已弃用)

译者:韩鹏帅

原文:Supported Operations for Automatic Encryption

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""