Azure DocumentDB 上的更改流

更改流是从数据库流到应用程序的数据库更改的实时流。 借助此功能,你可以通过订阅数据库更改来生成反应式应用程序,而无需持续轮询来检测更改。

注释

Azure DocumentDB 目前支持单分片群集中的更改流。 我们正在努力在不久的将来为多分片群集提供变更流支持。

Azure DocumentDB 对更改流施加 400 MB 的限制。 请提交支持请求以增加此限制。

启用更改流

可以使用 Azure CLI 或 ARM 模板启用或禁用此功能。 即将添加门户支持。

通过 CLI 在群集上启用更改流的步骤

  1. 登录到 Azure CLI
az login
  1. 检索群集上功能标志的当前设置。 这可确保在添加新功能时保留任何现有标志。
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Azure DocumentDB cluster>" --api-version 2024-10-01-preview
  1. 发送 PATCH 请求以启用该功能。
az resource patch --ids "/subscriptions/<subscription_id>/resourceGroups/<resource_group_name>/providers/Microsoft.DocumentDB/mongoClusters/<cluster-name>" --api-version 2024-10-01-preview --properties "{\"previewFeatures\": [ \"ChangeStreams\"]}"
  1. 验证结果:
    • 确保响应有效负载包括 "previewFeatures": ["ChangeStreams"]
    • 如果遇到错误“此群集不支持更改流”,请创建支持请求。

配置变更流

此示例代码在集合上 exampleCollection 启动更改流,持续监视任何更改。 检测到更改后,它会检索更改事件,并采用 JSON 格式打印该更改事件。

// Open a change stream
const changeStream = db.exampleCollection.watch();

// Listen for changes
while (changeStream.hasNext()) 
    {
        const change = changeStream.next();
        printjson(change);
    }

重要

通过在打开游标时指定恢复令牌到resumeAfter,可以恢复变更流。 不过,预计有足够的历史记录可以查找与令牌关联的操作。 在 _id 字段中观察到的更改流文档表示可恢复令牌。

cursor = db.exampleCollection.watch(resume_after=resume_token)

使用更改流监视数据库更改

让我们通过示例了解更改流输出。

在此更改流事件中,我们看到新记录已inserted进入数据库中的exampleCollectioncs集合中,事件详细信息包括新添加的文档的完整内容。

{
  "_id": { "_data": "AeARBpQ/AAAA" }, // "resume_token"
  "operationType": "insert",
  "fullDocument": {
    "_id": { "$oid": "66e6f63e6f49ecaabf794958" },
    "employee_id": "17986",
    "name": "John",
    "position": "Software Engineer",
    "department": "IT",
    "rating": 4
  },
  "ns": { "db": "cs", "coll": "exampleCollection" },
  "documentKey": { "_id": { "$oid": "66e6f63e6f49ecaabf794958" } }
}

在 Change Stream 中个性化数据

通过在设置时指定一个或多个管道阶段的数组来定制变更流输出。 支持的运算符包括以下内容。

  • $addFields
  • $match
  • $project
  • $set
  • $unset

局限性

  • 尚不支持在多分片群集上处理更改流事件。
  • 更改流游标需要在当前状态的故障转移事件后重新初始化。
  • Update 事件尚不支持更新描述。
  • pre-image 是不支持的选项。
  • $changestream 作为其他阶段的一部分的嵌套管道尚不受支持。