加密字段和启用查询
当使用可查询加密时,您可以使用加密模式在集合级别定义加密字段。加密字段并启用查询会增加存储需求并影响查询性能。您可以配置加密字段以进行等式或范围查询,但不能同时进行。根据预期的查询类型配置字段。
有关创建加密模式和配置查询的说明,请参阅创建加密模式.
支持的查询类型和行为
有关支持查询操作符和加密字段的列表,请参阅支持查询操作符。
客户端和服务器模式验证
MongoDB 支持使用 模式验证 来强制在集合中加密特定字段。使用自动查询加密的客户端的行为取决于数据库连接的配置
如果连接
encryptedFieldsMap
对象包含指定集合的键,客户端使用该对象执行自动查询加密,而不是使用远程模式。至少,本地规则必须加密远程模式中所有字段。如果连接
encryptedFieldsMap
对象不包含指定集合的键,客户端将下载服务器端远程模式并使用它。重要
远程模式行为
当使用远程模式时
客户端信任服务器有一个有效的模式
客户端仅使用远程模式执行自动查询加密。客户端不强制执行模式中指定的其他验证规则。
启用查询时的注意事项
您可以将加密字段设置为可查询。要更改哪些字段加密或可查询,请重新构建集合的加密模式并重新创建集合。
如果您不需要查询加密字段,您可能不需要在该字段上启用查询。您仍然可以通过查询其他可查询或未加密的字段来检索文档。
对于每个加密集合,MongoDB 创建两个元数据集合,增加存储空间。MongoDB 为每个加密字段创建一个索引,这将增加该字段的写操作时间。当写操作更新索引字段时,MongoDB 会更新相关索引。
配置加密字段以实现最佳搜索和存储
MongoDB 提供以下参数以方便调试和性能调整
min, max
查询类型: 仅范围查询。
类型:必须与字段的
bsonType
匹配。如果
bsonType
是decimal
或double
,则必须提供。如果它是int
、long
或date
,则虽然可选但强烈建议提供。默认值是bsonType
的最小和最大值。当可能时,指定字段的查询最小值和最大值(包含),因为较小的边界可以提高查询效率。如果查询这些边界之外的价值,MongoDB 将返回错误。
稀疏度
查询类型: 仅范围查询。
类型:从
1
-4
的整数。可选。默认值为
2
。影响 MongoDB 索引范围值的完整性。低稀疏度(密集索引)可以提高查询性能,但会在每个插入或更新操作中存储更多的文档在加密的元数据集合中,从而造成更大的存储开销。高稀疏度则相反。
精度
查询类型: 仅范围查询。
类型:整数。
可选。只有在
bsonType
是double
或decimal
时才允许。如果未设置,MongoDB 将使用与bsonType
相同的最大精度,即double
或decimal
。确定在查询双精度浮点数或十进制字段时考虑多少位数字。每增加一位数字都会增加存储开销,并对可搜索范围和索引生成产生重大影响。此参数限制了范围查询的精度。不同的
精度
值会影响查询输出,尽管加密值仍然以完整精度存储。
trimFactor
查询类型: 仅范围查询。
类型:整数。
可选。默认值为
6
。trimFactor
控制并发插入和更新的吞吐量。较高的trimFactor
会增加并发插入和更新的吞吐量,但会降低某些范围读取操作的速率。较低的trimFactor
则相反。
contention
查询类型: 等值和范围查询。
类型:整数。
可选。默认值为
8
。并发写入操作,如连续快速地将相同的字段/值对插入多个文档中,可能会导致竞争:延迟操作冲突。
使用可查询加密,MongoDB 使用内部计数器跟踪加密集合中每个字段/值对的发生次数。类似于数组,竞争系数 将此计数器分区。这在使用
insert
、update
或findAndModify
添加或修改具有相同字段/值对的加密字段时,最小化了递增计数器的问题。contention = 0
创建一个索引为 0 的单元素数组。contention = 4
创建一个索引为 0-4 的 5 元素数组。MongoDB 在插入时递增随机数组元素。当未设置时,
contention
默认为8
,这为大多数工作负载提供高性能。更高的争用可以提高低基数字段上的插入和更新操作的性能,但会降低查找性能。您可以选择在可查询字段上包含
contention
以改变其默认值8
。有关争用因子及其加密影响的更详细信息,请参阅 MongoDB 的可查询加密技术论文中的“第9节:指南”。