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

Queryable Encryption 的支持操作

在此页面上

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

本页文档了为自动加密配置的 MongoDB 版本 6.0 或更高版本的兼容驱动程序支持的特定命令、查询操作符、更新操作符、聚合阶段和聚合表达式。

注意

Enterprise 版功能

使用 MongoDB 6.0 或更高版本的 MongoDB Enterprise 和 MongoDB Atlas 提供自动加密。

MongoDB将可Queryable Encryption加密字段存储为 BinData blob。 与对解密值发出相同操作相比,对加密BinData值发出读取和写入操作可能会出现意外或不正确的行为。 某些操作具有严格的BSON类型支持,如果针对BinData值发出这些操作会返回错误。 与使用自动加密和可查询Queryable Encryption功能的MongoDB 6.0或更高版本兼容的官方驱动程序会解析不支持BinData值或在针对BinData值发出时有异常行为的操作符或表达式的写入操作。

使用显式Queryable Encryption的应用程序可以使用此页面作为针对加密字段发出读取和写入操作的指导。

MongoDB 6.0 或更高版本的官方驱动程序支持使用以下命令进行自动加密:

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

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

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

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

配置为自动加密的驱动程序在针对加密的可查询字段发布时支持以下查询操作符:

重要

比较支持

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

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

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

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

即使使用支持的查询操作符,将加密字段与null或正则表达式进行比较的查询也始终会引发错误。

针对加密字段发出$exists操作符时,该操作符具有正常行为。

针对加密字段指定任何其他查询运算符的查询都会返回错误。 在使用为 Queryable Encryption 配置的 MongoClient 时,即使不是针对加密字段发出,以下查询运算符也会引发错误:

配置为自动加密的驱动程序在针对加密字段发布时支持以下更新操作符:

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

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

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

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

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

支持替换式更新,但如果替换文档的顶级加密字段中包含Timestamp(0,0) ,Queryable Encryption 将出错。 (0,0)值指示mongod应生成时间戳。 mongod无法生成加密字段。

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

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

自动加密不支持读取或写入其他collection的聚合阶段。这些阶段是:

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

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

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

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

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

自动加密不支持“无连接”聚合元数据源,此类源会读取不属于特定collection的元数据,例如:

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

配置为自动加密的兼容驱动程序支持针对任何相等查询类型加密字段的以下表达式:

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

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

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

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

Queryable Encryption无法充分隐藏这些值的类型信息。

Queryable Encryption 不支持对加密字段执行将加密字段与以下值类型进行比较的读取或写入操作:

  • array

  • decimal128

  • double

  • object

后退

Queryable Encryption 限制