Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / / /

自动加密支持的操作

在此页面上

  • 支持的读取和写入命令
  • 支持的查询操作符
  • 不支持的插入操作
  • 支持的更新操作符
  • 支持的聚合阶段
  • $group 行为
  • $lookup$graphLookup 行为
  • 支持的聚合表达式
  • 不支持的字段类型

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

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

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

  • 支持的查询操作符

  • 支持的更新操作符

  • 支持的聚合阶段

  • 支持的聚合表达式

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

如果向自动客户端字段级加密配置的驱动程序发出任何其他命令,将返回错误。

[1] 虽然自动客户端字段级加密 (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 schema 必须为源字段名称和目标字段名称指定相同的加密元数据。

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

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

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

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

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

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

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

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

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

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

$group 支持:

  • 对确定性加密字段进行分组。

  • 在加密字段中使用 $addToSet$push 累加器。

$group 不支持:

  • $addToSet$push 累加器返回的数组进行匹配。

  • 加密字段上的算术累加器。

仅当 from 集合与聚合运行所针对的集合匹配时(特别是自查找操作),自动客户端字段级加密才会支持 $lookup$graphLookup

引用不同 from 集合的 $lookup$graphLookup 阶段会返回错误。

配置为自动客户端字段级加密的驱动程序允许针对确定性加密字段使用以下表达式的聚合阶段:

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

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

表达式
已拒绝行为
例子
该表达式指定一个字段,其加密属性在运行时之前不可知,并且后续聚合阶段包括引用该字段的表达式。
$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"
]
}

配置为自动客户端字段级加密 (CSFLE) 的驱动程序支持任何需要加密以下值类型的的读写操作:

加密不能充分隐藏这些值的类型信息。

自动 CSFLE 不支持对确定性加密字段进行读取或写入操作,在该字段中,该操作将加密字段与以下值类型进行比较:

  • array

  • bool

  • decimal128

  • double

  • object

后退

模式执行