文档菜单
文档首页
/
MongoDB 手册
/ / / / /

自动加密支持的运算操作

本页内容

  • 支持的读取和写入命令
  • 支持的查询操作符
  • 不支持的插入操作
  • 支持更新操作符
  • 支持聚合阶段
  • $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 架构必须指定源字段名和目标字段名的相同加密元数据。

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

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

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

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

对于指定对确定性加密字段进行 受支持运算符 的查询过滤器的更新操作,查询过滤器必须仅使用这些字段上的受支持运算符。

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

针对配置为自动加密的集合执行管道的任何其他阶段都会返回错误。

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

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

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

$group支持

  • 在确定加密字段上进行分组。

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

$group不支持

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

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

自动客户端字段级加密支持使用 $lookup$graphLookup 操作(仅在 from 集合与聚合操作针对的集合相匹配的情况下,即自查找操作)。

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

您不能从启用 CSFLE 的 MongoClient 在未加密的集合上执行 $lookup 操作。

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

如果对加密字段发出其他聚合表达式,则所有其他聚合表达式将返回错误。

具有以下行为的聚合阶段即使在使用受支持的聚合表达式的情况下也将返回错误

表达式
拒绝的行为
示例
该表达式指定一个字段,其加密属性必须在运行时才能知道,并且后续聚合阶段包括一个引用该字段的表达式。
$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"
}
}
}

表达式的第一个参数是加密字段,并且

  • 表达式的第二个参数不是数组字面量

    -OR-

  • 表达式的第二个参数是加密字段。

{
$in : [
"$encryptedField" ,
"$otherEncryptedField"
]
}

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

加密不足以隐藏这些值的类型信息。

CSFLE不支持对文档数组中的字段自动加密。

自动CSFLE还不支持对以下值类型的确定加密字段的读取或写入操作

  • 数组

  • 布尔值

  • decimal128

  • 双精度浮点数

  • 对象

后退

模式强制执行

© . All rights reserved.