mongodb 7.0 的 queryable encryption 仅支持相等和范围查询,不支持传统 bson 索引,加密字段依赖驱动与自动加密共享库协同管理的加密索引,服务器无法识别或优化。

Queryable Encryption 在 MongoDB 7.0 中是否支持搜索索引加密
不支持。MongoDB 7.0 的 Queryable Encryption 仅支持 equal 和 range 查询,且加密字段上**不能创建传统 BSON 索引**(如 createIndex({ field: 1 }))。所谓“搜索索引”是常见误解——它实际依赖的是加密引擎自动生成的、与加密模式绑定的**加密索引(encrypted index)**,由驱动和自动加密共享库协同管理,数据库服务器本身无法识别或优化这类索引。
配置前必须确认的三个硬性条件
缺一不可,否则 autoEncryption 启动即失败:
- MongoDB Server 必须是
Atlas 7.0+或Enterprise 7.0+;Community Server 完全不支持自动加密 - 必须下载并指定有效的
crypt_shared动态库路径(如/usr/lib/libcrypt_shared.so),不能用mongocryptd - 连接 URI 必须启用 TLS(
?tls=true),且密钥管理服务(如 AWS KMS、Azure Key Vault)需已正确配置凭证与权限
加密字段定义与模式注册的关键写法
错误常出在 encryptedFieldsMap 结构或字段路径拼写上。它不是直接写进 collection schema,而是通过驱动传给客户端加密库的 JSON Schema:
{
"escCollection": "__keyVault",
"ecocCollection": "__encryptedDataKeys",
"fields": [
{
"path": "ssn",
"bsonType": "string",
"queries": { "queryType": "equality" }
}
]
}
注意:path 必须严格匹配文档中字段名(区分大小写);escCollection 和 ecocCollection 名称不能修改;queries 块只在需要相等查询时才加,范围查询需额外声明 "queryType": "range" 并指定 "min"/"max" 类型。
为什么 find({ ssn: "123-45-6789" }) 查不到数据
最常见原因有三个:
- 应用未启用
autoEncryption配置(漏掉extraOptions: { cryptSharedLibPath: "<code>SHARED_LIB_PATH" }) - 字段值在插入时未走加密路径(比如用 Compass 手动插入明文,或绕过 Mongoose 中间件直连 driver)
- 密钥未在
__keyVault中正确生成:必须调用clientEncryption.createDataKey()显式创建,不能依赖 Atlas UI 自动勾选生成(UI 仅设置元信息,不触发密钥落地)
加密后的字段在 shell 或 Compass 里显示为乱码二进制,这是正常现象;解密只发生在客户端驱动层,服务器永远看不到明文。











