【问题标题】:how to capture changes with Azure function Cosmos DB trigger?如何使用 Azure 函数 Cosmos DB 触发器捕获更改?
【发布时间】:2020-07-12 17:21:50
【问题描述】:

我有以下要求,我想从 cosmosDB 捕获记录并将其推送到博客存储。

我已经使用 azure 函数 cosmos DB 触发器解决了上述问题(它将捕获对记录在 cosmos DB 容器中所做的任何更改)。

如何捕获满载?

要求我必须从 cosmos DB 容器中获取所有记录并将其推送到博客存储。

所以问题是 cosmosDB 触发器仅在记录发生变化时才捕获,所以我如何才能实现这种完全加载。

对于满载,我还创建了一个 python 脚本。

参考:https://github.com/Azure/azure-cosmos-python

参考脚本:How To Update Record in Cosmos Db using python?

query_data = client.QueryItems(collection_link,
                                   'SELECT * FROM ' + COSMOS_DB_COLLECTION_ID,
                                   {'enableCrossPartitionQuery': True})
    for item in query_data:
        client.ReplaceItem(item['_self'], item, options=None)

所以实际上我的脚本正在执行它的所有记录,我正在为每条记录调用 ReplaceItem,但我观察到的是 azure 函数 cosmos DB 触发器不会捕获所有记录的更改,它只捕获少数记录。

那么脚本有问题吗?

【问题讨论】:

  • 你这里的要求不是很清楚。 cosmos db 触发器将触发对数据库中文档的任何更改。如果要将数据库的全部内容复制到 blob 存储中,则需要其他解决方案。

标签: azure-functions azure-cosmosdb cosmosdbtrigger


【解决方案1】:

首先,我认为客户端没有“QueryItems”。

第二,你的文档没有变化。

你应该这样做:

url = os.environ['ACCOUNT_URI']
key = os.environ['ACCOUNT_KEY']
client = cosmos_client.CosmosClient(url, {'masterKey': key})
database_name = "testbowman"
container_name = "testbowman"
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)
for item in container.query_items('SELECT * FROM c', enable_cross_partition_query=True):
    logging.info("This is Query database!" + json.dumps(item))
    item['Description'] = "!!!!!!!!!!!!!!"
    container.replace_item(item['id'],item)

【讨论】:

  • 正如你所说,我的文档没有变化。但我注意到,如果我没有像在上面的脚本中那样更新文档,那么 azure cosmos DB 触发器将捕获很少的记录。知道为什么。可能是因为 _ts 字段?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2022-06-23
  • 1970-01-01
  • 2021-02-10
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多