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

可查询加密的支持操作

本页内容

  • 使用以下操作BinData
  • 支持和不支持的 BSON 类型
  • CRUD
  • 支持的读和写命令
  • 支持的查询运算符
  • 不支持查询
  • 支持的更新运算符
  • 替换式更新
  • 不支持插入操作
  • 不支持聚合阶段
  • 支持的聚合阶段
  • $lookup$graphLookup 行为
  • 支持的聚合表达式
  • 不支持字段类型

本页记录了与可查询加密兼容的驱动程序支持的特定数据类型、命令、查询运算符、更新运算符、聚合阶段和聚合表达式。它概述了使用自动加密的操作和使用显式加密的操作的行为。

注意

企业功能

自动加密在 MongoDB 企业版和 MongoDB Atlas 中可用

MongoDB 将可查询加密加密字段存储为BinData 块。针对加密的 BinData 值发出的读和写操作可能与针对解密值执行相同操作的行为不同或错误。某些操作具有严格的 BSON 类型支持,在针对 BinData 值发出时返回错误。

与可查询加密兼容的官方驱动程序解析不支持 BinData 值的运算符或表达式的读和写操作。

可查询加密支持对所有以下BSON 类型的相等查询,除了以下类型:

  • double

  • decimal128

  • object

  • array

可查询加密支持以下BSON 类型的范围内查询:

  • int:32位整数

  • long:64位整数

  • double:双精度浮点数(IEEE 754 Binary64)

  • decimal:十进制数(IEEE 754 Decimal128)

  • date:UTC 日期时间(Int64)

  • 可查询加密不支持多文档更新或删除操作。《a class="leafygreen-ui-tqgtui" href="/docs/manual/reference/method/db.collection.updateMany/#mongodb-method-db.collection.updateMany">db.collection.updateMany()db.collection.bulkWrite() 中包含多个更新或删除操作不被支持。

  • 可查询加密限制了 db.collection.findAndModify() 参数。

    • fields 不被允许

    • new 必须为 false

  • 执行更新操作时,过滤器中任何加密的字段都会从插入中排除。

可查询加密兼容驱动支持以下命令的自动加密:

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

  • 支持的查询运算符

  • 支持的更新运算符

  • 支持的聚合阶段

  • 支持的聚合表达式

以下命令不需要自动加密。配置为自动加密的官方驱动程序将直接将这些命令传递给 mongod:

通过配置为自动加密的兼容驱动程序发出任何其他命令将返回错误。

[1] 虽然自动加密不加密getMore命令,但命令的响应可能包含加密的字段值。
  • 配置了正确可查询加密选项的应用程序会自动解密这些值。
  • 未配置正确加密选项的应用程序将看到加密的值。

配置为自动加密的驱动程序在针对加密的可查询字段发出查询时支持有限的查询运算符集。

查询非加密字段或使用受支持的查询类型查询加密字段将返回加密数据,然后在客户端进行解密。

可查询加密目前支持 noneequalityrange 查询类型。如果未指定查询类型,则默认为 none。如果查询类型为 none,则字段被加密,客户端无法查询它。

重要

比较支持

支持将加密字段与明文值进行比较。

{$expr: {$eq: ["$encrypted1", "plaintext_value"]}}

将一个加密字段与另一个加密字段进行比较将失败。

{$expr: {$eq: ["$encrypted1", "$encrypted2"]}}

配置为 queryType: "equality" 的字段支持以下表达式

queryType: "range" 配置的字段支持以下表达式

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

将加密字段与 null 或正则表达式进行比较的查询始终会抛出错误,即使使用受支持的查询运算符。

在使用为可查询加密配置的 MongoClient 时,以下查询运算符将抛出错误,即使是对未加密字段发出的

配置为自动加密的驱动程序在针对加密字段发出时支持以下更新运算符

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

以下行为的更新操作将抛出错误,即使使用受支持的运算符

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

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

对于指定加密字段 查询过滤器 的更新操作,查询过滤器必须仅使用 受支持的运算符

支持替换式更新,但是,如果替换文档中包含顶级加密字段内的 Timestamp(0,0),可查询加密将出现错误。值 (0,0) 表示 mongod 应生成时间戳。由于 mongod 无法生成加密字段,因此生成的时间戳将是未加密的。

配置为自动加密的兼容驱动程序不支持以下行为的插入命令

  • 将具有与加密字段相关联的 Timestamp(0,0) 的文档插入。值 (0,0) 表示 mongod 应生成时间戳。由于 mongod 无法生成加密字段,因此生成的时间戳将是未加密的。

自动加密不支持从或写入额外集合的聚合阶段。这些阶段包括

支持自动加密的兼容驱动程序配置了以下聚合管道阶段

在配置为自动加密的集合上操作且指定了任何其他阶段的聚合管道将返回错误。

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

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

自动加密仅支持当 from 集合与聚合运行的集合相匹配时 $lookup$graphLookup。引用不同 from 集合的 $lookup$graphLookup 阶段将返回错误。

自动加密不支持“无连接”聚合元数据源,它读取不涉及特定集合的元数据,例如

自动加密不支持 $planCacheStats 阶段,因为结果可能包含敏感信息。

您无法从启用了可查询加密的 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"
]
}

配置了自动加密的驱动程序不支持任何需要加密以下值类型的读取或写入操作

可查询加密未能充分隐藏这些值的数据类型信息。

可查询加密不支持在文档数组内的字段上进行自动加密。

可查询加密不支持在加密字段上执行读取或写入操作,其中操作会将加密字段与以下值类型进行比较

  • array

  • decimal128

  • double

  • object

返回

参考