使用Queryable Encryption时,可以使用加密模式在集合级别定义加密字段。 加密字段并启用查询会增加存储要求并影响查询性能。 您可以为相等查询或范围查询配置加密字段,但不能同时为两者配置加密字段。 配置预期查询类型的字段。
有关创建加密模式和配置查询的说明,请参阅创建加密模式。
支持的查询类型和行为
有关支持的查询运算符和加密字段行为的列表,请参阅支持的查询运算符。
模式验证
Queryable Encryption需要服务器端加密模式来实施对集合中的特定字段加密。使用自动Queryable Encryption的客户端的行为因数据库连接配置而异:
至少,本地规则必须加密与服务器上远程模式相同的字段。
如果连接
encryptedFieldsMap
对象包含指定集合的密钥,则客户端使用该对象执行自动Queryable Encryption,而不是使用远程模式。如果连接
encryptedFieldsMap
对象不包含指定集合的密钥,客户端将下载并使用该集合的远程模式。重要
远程模式行为
使用远程模式时:
客户端相信服务器具有有效的模式
客户端仅使用远程模式来执行自动 Queryable Encryption。客户端不会实施该模式中指定的任何其他验证规则。
启用查询时的注意事项
在创建集合之前,决定哪些字段应该加密和/或可查询。要更改哪些字段已加密或可查询,需要重建集合的加密模式并重新创建集合。
如果不需要查询加密字段,则可能不需要启用对该字段的查询。 您仍然可以通过查询其他可查询或未加密的字段来检索文档。
对于每个加密的集合, MongoDB都会创建两个元数据集合,从而增加存储空间。 MongoDB为每个加密字段创建一个索引,这会增加对该字段执行写入操作的持续时间。 当写入操作更新索引字段时, MongoDB会更新相关索引。
配置加密字段以实现最佳搜索和存储
MongoDB提供了以下参数以方便调试和性能调优:
min, max
查询类型:
range
类型:必须与字段的
bsonType
匹配。如果
bsonType
为decimal
或double
,则为必填项。 可选,但如果为int
、long
或date
,则强烈建议使用。 默认为bsonType
最小值和最大值。尽可能指定字段的最小和最大(含)可查询值,因为更小的边界可以提高查询效率。 如果查询的值超出这些范围, MongoDB将返回错误。
子字符串参数
警告
前缀、后缀和子字符串查询处于公共预览状态
Queryable Encryption前缀、后缀和子字符串查询在MongoDB 8.2 的公共预览版中可用。请勿在生产环境中启用这些查询类型。公共预览功能将与 GA功能不兼容,您必须删除任何启用这些查询的集合。
strMaxLength
查询类型:
substringPreview
类型:1 -60 (含)之间的整数。
子字符串索引字段的最大允许长度。尝试插入更长的字符串会返回错误。
重要
您可以通过设置
fleDisableSubstringPreviewParameterLimits
来覆盖字符限制,但对较长的字符串运行子字符串查询会对性能产生重大影响。
strMinQueryLength
查询类型:
prefixPreview
、suffixPreview
、substringPreview
类型:正整数。
对于
prefixPreview
或suffixPreview
查询,必须为 >= 1。对于
substringPreview
查询,必须为 >= 2。
允许的最小前缀/后缀/子字符串长度。尝试查询较短的字符串会返回错误。
strMaxQueryLength
查询类型:
prefixPreview
、suffixPreview
、substringPreview
类型:正整数 -1 对于
prefixPreview
或 查询,其值必须 >=suffixPreview
。2 -10 对于substringPreview
查询,必须为 - (含)。要查询的最大允许前缀/后缀/子字符串长度。尝试查询更长的字符串会返回错误。
重要
此设置会严重影响查询性能。尽可能限制最大查询长度。
高级查询参数
警告
这些参数仅供高级用户使用。默认值适用于大多数使用案例,并且仅应在使用案例需要时进行修改。
sparsity
查询类型:
range
类型: 1 - 4之间的整数。
可选。默认值为 2。
影响MongoDB对范围值进行索引的彻底程度。 低稀疏性(密集索引)可提高查询性能,但会在每次插入或更新操作的加密元数据集合中存储更多文档,从而导致更大的存储开销。 高稀疏度则相反。
precision
查询类型:
range
类型:整数。
可选。 仅当
bsonType
为double
或decimal
时才允许。如果未设置, MongoDB将使用与bsonType
相同的最大精度,即double
或decimal
。限制在查询
double
或decimal
字段时考虑的点后的位数。其他数字将被舍去,而不是四舍五入。示例,1 的precision
将10.18
视为10.1
进行查询。加密的值仍存储为10.18
。指定
precision
并尽可能限制它。每一位数字都会增加存储开销,并对可搜索范围和索引生成产生很大影响。
trimFactor
查询类型:
range
类型:整数。
可选。默认值为 6。
trimFactor
控制并发插入和更新的吞吐量。较高的trimFactor
会提高并发插入和更新的吞吐量,但会费用某些范围读取操作的速度。较低的trimFactor
则执行相反操作。
contention
查询类型:
equality
、range
、prefixPreview
、suffixPreview
、substringPreview
类型:整数。
可选。默认值为 8。
并发写操作,例如在多个文档中连续插入相同的字段/值对,可能会导致争用:即延迟操作的冲突。
通过Queryable Encryption, MongoDB使用内部计数器跟踪加密集合中每个字段/值对的出现次数。 争用因子对该计数器进行分区,类似于大量。 这样可以最大限度地减少使用
insert
、update
或findAndModify
连续添加或修改具有相同字段/值对的加密字段时递增计数器的问题。contention = 0
创建一个大量,在索引0处包含一个元素。contention = 4
会在索引0 - 4处创建一个包含5个元素的大量。 MongoDB在插入期间递增随机大量元素。未设置时,
contention
默认为8
,可为大多数工作负载提供高性能。 较高的争用可提高低关联基数字段上的插入和更新操作的性能,但会降低查找性能。您可以选择在可查询字段上包含
contention
,以更改该值的默认8。有关争用因素及其加密影响的更全面信息,请参阅9 MongoDB 的 Queryable Encryption技术论文中的“第 节:指南”。