限制
在此页面上
Overview
在启用Queryable Encryption之前,请考虑这些限制和约束。 某些操作不受支持,而其他操作的行为则不同。
Atlas Search
Queryable Encryption与 MongoDB Atlas Atlas Search不兼容。
MongoDB 支持限制
在集合上启用 Queryable Encryption 会导致某些诊断命令中的字段被脱敏,并且查询日志中会省略一些操作。这限制了 MongoDB 的支持工程师获取可用的数据,特别是在分析查询性能时。要衡量操作对加密集合的影响,可使用第三方应用程序性能监控工具来收集指标。
有关详细信息,请参阅“日志校订”部分。
竞争因子
争用因子是一种有助于根据并发操作数量调整性能的设置。 未设置时,争用使用默认值 8
,可为大多数工作负载提供高性能。
只有在指定加密字段时才能设置争用因子。一旦指定了加密字段,争用因子就不可更改。
有关更多信息,请参阅配置争用因子。
手动元数据集合压缩
当元数据集合的大小超过 1 GB 时,请手动执行元数据集合压缩操作。压缩操作可以减小与加密字段相关的元数据集合的大小,并提升性能。
encryptedFieldsMap 修改
请勿修改传递给 MongoClient
的 encryptedFieldsMap
。该操作会导致查询时出现意外和不正确的行为。
读写操作支持
mongod
仅存储加密的 BinData
并针对 BinData
值应用指定加密字段的任何聚合表达式或查询操作符。虽然表达式或操作符可能支持 BinData
字段,但与针对解密值发出相同的表达式或操作符相比,结果值可能不正确或不符合预期。如果表达式或操作符不支持 BinData
值,mongod
会引发错误。
日志校订
为了提高安全性,Queryable Encryption 会隐去加密集合上某些诊断命令中的字段,并从查询日志中省略某些操作。加密集合是任何带有 encryptedFields
选项的集合。
查询日志和数据库分析器编辑
在加密集合上运行以下 CRUD 操作时,慢操作查询日志和数据库分析器 system.profile
集合中会省略这些操作。
compactStructuredEncryptionData
命令cleanupStructuredEncryptionData
命令
命令和聚合阶段输出编辑
collStats
命令和 $collStats
聚合阶段:
Omit
"queryExecStats"
Omit
"latencyStats"
编辑
"WiredTiger"
(如果存在)以仅包含url
字段。
currentOp
命令和 $currentOp
聚合阶段:
省略
"command"
之后的所有字段。编辑
"command"
以仅包含第一个元素$comment
和$db
。
top
命令仅返回加密集合的集合名称。
$planCacheStats
聚合阶段会省略针对加密集合的操作,即使这些操作会正常缓存。
拓扑支持
支持副本集和分片集群
不支持独立部署
不支持从节点读取
分片
元数据集合不能被分片
分片键不得是加密字段
对于使用 Queryable Encryption 分片集群事务,您必须将 readConcern 设置为
snapshot
。
CRUD
Queryable Encryption 不支持多文档更新操作。不支持
db.collection.updateMany()
。Queryable Encryption 不支持多语句更新或删除操作。不支持包含多个更新或删除操作的
db.collection.bulkWrite()
。Queryable Encryption限制
db.collection.findAndModify()
参数。fields
不允许new
必须为 false
执行更新或插入操作时,过滤器中的任何加密字段都将从插入中排除。
集合
您不能对同一集合同时使用客户端字段级加密和 Queryable Encryption。
Queryable Encryption 不支持从使用客户端字段级加密进行加密的集合进行迁移。您必须解密您的文档并将其逐个插入。
Queryable Encryption不支持未加密集合的自动迁移。 您必须逐个插入文档。
Queryable Encryption 仅支持新集合。您不能向现有集合添加或删除 Queryable Encryption。
您无法重命名具有加密字段的集合。
如果
jsonSchema
包含encrypt
关键字,则在创建 Queryable Encryption 集合时不能将jsonSchema
指定到db.createCollection()
。只要您的 jsonSchema 不包含加密字段验证,您就可以将
encryptedFields
和jsonSchema
一起指定到db.createCollection()
。
您无法禁用
jsonSchema
验证。当集合使用
encryptedFields
选项时:无法将
validationLevel
设置为none
。无法将
validationAction
设置为warn
。
删除集合
从未配置为 Queryable Encryption 的
MongoClient
中删除集合,不会删除关联的元数据集合。如果您在删除元数据集合之前删除带有加密字段的集合,则mongod
会记录警告。
提示
删除为可查询Queryable Encryption配置了MongoClient
的集合时,兼容的驱动程序也会删除关联的元数据集合。
创建集合
始终显式创建使用Queryable Encryption的任何集合。 隐式集合创建不会创建必要的索引和元数据集合,从而导致查询性能不佳。
查询类型
在 encryptedFieldsMap
中创建集合时,为字段指定的查询类型是不可变的。您无法在现有字段上添加新的查询类型,也不能修改现有的查询类型。
加密字段名称
加密的字段名称不可更改。例如,如果指定 ssn
作为要加密的字段,那么您不能将字段名称 $rename
为taxPayerID
。
视图
应用程序不能依赖自动加密验证来阻止对具有加密字段的集合上的视图进行不支持的查询。
如为基础视图聚合管道或查询引用加密字段,则对包含(使用 Queryable Encryption)加密值的集合上的视图查询可能会返回意外或不正确的结果。如果在包含(使用 Queryable Encryption)加密值的集合上创建视图,请勿对加密字段进行操作,以降低出现意外或错误结果的风险。
有关视图的详细信息,请参阅视图。
排序规则
Queryable Encryption 忽略用户指定的排序规则或集合默认排序规则。加密会掩盖字段值,并阻止正常的排序规则行为。对加密字段的排序规则敏感查询可能会返回意外或不正确的结果。
有关排序规则的更多信息,请参阅排序规则文档。
可查询加密兼容驱动程序有一个支持的自动加密操作列表。对于不支持的读取和写入操作,底层支持库无法内省集合目录来识别默认排序规则。因此,应用程序不能依赖可查询加密验证来阻止对具有默认排序规则的加密字段进行查询。
Unique Indexes
如果索引键指定了任何加密字段,则唯一索引无法保证唯一性。
即使输入相同,可查询加密也总是输出不同的加密值。Server 认为每个加密值都是唯一的,即使解密值可能不唯一。这意味着,即使某个集合对字段使用了索引强制唯一约束,该集合仍可能包含多个对该字段具有重复明文值的文档。
配置为自动加密的 Queryable Encryption 兼容驱动程序支持某些自动加密操作。 对于不支持的读取和写入操作,底层库无法自省索引目录以将给定字段标识为唯一字段。 应用程序不能依赖自动加密验证来防止对随机加密字段的唯一约束违规。
_id 字段
您无法将可查询加密配置为加密 _id
字段,因为它依赖于 MongoDB 自动生成的值。
读/写查询支持
自动加密支持一部分命令、查询操作符、更新操作符、聚合阶段和聚合表达式。有关支持的操作的列表,请参阅自动加密的支持操作。