Overview
在本指南中,您可以了解以下 Queryable Encryption 主题:
- 如何指定加密字段。 
- 创建collection时如何指定加密字段是否可查询。 
- 查询类型以及哪些类型可用于加密字段。 
- 在决定是否启用对加密字段的查询时要考虑哪些因素。 
指定加密字段
Queryable Encryption 允许您指定要在 MongoDB 文档中自动加密的字段。
重要
您可以指定文档中的任何字段进行加密,但 _id字段除外。
要指定用于加密和查询的字段,请定义包含以下属性的 JSON schema:
| 密钥名称 | 类型 | 必需? | 
|---|---|---|
| 
 | 字符串 | 必需 | 
| 
 | 字符串 | 必需 | 
| 
 | 二进制文件 | 必需 | 
| 
 | 对象 | 可选,除非您希望能够查询该字段,否则请省略。 | 
例子
此示例展示了如何创建 JSON schema,以指定 Queryable Encryption 功能应自动加密的字段。
考虑以下包含个人身份信息 (PII)、信用卡信息和敏感医疗信息的文档:
{    "firstName": "Jon",    "lastName": "Snow",    "patientId": 12345187,    "address": "123 Cherry Ave",    "medications": [       "Adderal",       "Lipitor"    ],    "patientInfo": {       "ssn": "921-12-1234",       "billing": {             "type": "visa",             "number": "1234-1234-1234-1234"       }    } } 
为确保 PII 和敏感医疗信息的安全,请创建一个 JSON schema,将 Queryable Encryption 配置为自动加密这些字段。以下示例 JSON schema显示了如何指定要加密的字段:
const encryptedFieldsObject = {    fields: [       {          path: "patientId",          keyId: "<unique data encryption key>",          bsonType: "int"       },       {          path: "patientInfo.ssn",          keyId: "<unique data encryption key>",          bsonType: "string"       },       {          path: "medications",          keyId: "<unique data encryption key>",          bsonType: "array"       },       {          path: "patientInfo.billing",          keyId: "<unique data encryption key>",          bsonType: "object"       },    ] } 
请注意, keyId字段需要唯一的数据加密密钥(DEK) ,可查询Queryable Encryption使用该密钥来加密字段。 有关 DEK 的更多信息,请参阅加密密钥管理。
指定可查询的加密字段
在您想要在 JSON schema 中使其可查询的字段上包含queries属性。 这使授权客户端能够使用加密字段发出读取和写入查询。 您可以省略queries属性,除非您希望能够查询该字段。
例子
以下代码段展示了如何将queries属性添加到 JSON schema,以使patientId和patientInfo.ssn字段可查询。
const encryptedFieldsObject = {    fields: [       {          path: "patientId",          keyId: "<unique data encryption key>",          bsonType: "int",          queries: { queryType: "equality" }       },       {          path: "patientInfo.ssn",          keyId: "<unique data encryption key>",          bsonType: "string",          queries: { queryType: "equality" }       },       {          path: "medications",          keyId: "<unique data encryption key>",          bsonType: "array"       },       {          path: "patientInfo.billing",          keyId: "<unique data encryption key>",          bsonType: "object"       },    ] } 
有关查询类型的更多信息,请参阅查询类型。
启用可查询加密
您可以通过以下方式对 JSON schema中指定的字段启用 Queryable Encryption:
- 将 - encryptedFieldsObject常量表示的 JSON schema传递给应用程序用于创建collection的客户端,如以下代码片段所示:
const client = new MongoClient(uri, {    autoEncryption: {       keyVaultNameSpace: "<your keyvault namespace>",       kmsProviders: "<your kms provider>",       extraOptions: {          cryptSharedLibPath: "<path to FLE Shared Library>"       },       encryptedFieldsMap: {          "<databaseName.collectionName>": { encryptedFieldsObject }       }    }    ...    await client.db("<database name>").createCollection("<collection name>"); } 
注意
在创建collection之前启用Queryable Encryption非常重要。在创建collection后启用 Queryable Encryption 不会加密该collection中已有文档的字段。
有关 autoEncryption 配置选项的更多信息,请参阅 MongoClient 的 Queryable Encryption 选项一节。
- 将加密的字段对象传递给调用以创建新的collection,如以下代码片段所示: 
await encryptedDB.createCollection("<collection name>", {    encryptedFields: encryptedFieldsObject }); 
提示
For the highest level of security, specify the encrypted fields both when creating the collection, and when creating a client to access the collection. 这样可以确保如果服务器的安全性遭到破坏,信息仍然通过客户端进行加密。
重要
MongoDB 建议在使用 Queryable Encryption 时显式创建collection,而不是通过插入操作隐式创建collection。使用createCollection()创建collection时,该操作会在加密字段上创建索引。如果没有索引,对加密字段的查询可能会运行缓慢。
查询类型
Queryable Encryption 允许您通过将查询类型传递给加密字段对象中的queries选项来指定要启用查询的字段。
Queryable Encryption 目前支持none或equality查询类型。 作为 MongoDB 6.0 中 Queryable Encryption 的一部分引入的新框架旨在容纳其他表达性搜索,例如范围和字符串操作符。
查询类型none表示数据将被加密,但不可查询。 无法对查询类型为none的加密数据运行查询。 如果在以下位置运行查询,则会返回加密数据:
- 非加密字段 
- 位于同一集合中查询类型为 - equality的字段,并在客户端解密。
重要
无指定查询类型
如果未显式指定查询类型,则查询类型将默认为none ,并且无法查询数据。
equality查询类型允许您使用以下表达式查询加密字段:
注意
即使使用支持的查询操作符,将加密字段与null或表达式进行比较的查询也会导致错误。
当操作将加密字段与以下任何BSON类型进行比较时,使用equality查询类型的 Queryable Encryption 不支持对该字段进行读取或写入操作:
- double
- decimal128
- object
- array
- javascriptWithScope(已弃用)
启用查询时的注意事项
使用“可查询加密”时,可以选择是否将加密字段设置为可查询。 如果您不需要执行读取操作或需要读取加密字段的写入操作,您可以决定不启用对该字段的查询。 您仍然可以通过查询其他可查询或未加密的字段来检索整个文档。
当您将加密字段设置为可查询时,Queryable Encryption 会为每个加密字段创建一个索引,这会使该字段的写入操作花费更长时间。 当写入操作更新索引字段时,MongoDB 也会更新相关索引。
对加密字段启用查询时,您的集合需要更多存储空间。 这些集合名称以enxcol_.开头,包含重要的加密元数据。
警告
请勿修改以enxcol_.开头的collection。