Azure 函数插入但不更新 cosmosDB
Azure function inserting but not updating cosmosDB
我有一个 azure 函数从 Azure 服务总线队列接收消息并将文档发送到 cosmosDB。我正在使用 Azure 函数 1.x:
public static class Function1
{
[FunctionName("Function1")]
public static void Run([ServiceBusTrigger("ServiceBusQueue", AccessRights.Manage, Connection = "ServiceBusQueueConnection")]BrokeredMessage current, [DocumentDB(
databaseName: "DBname",
collectionName: "Colname",
ConnectionStringSetting = "CosmosDBConnection")]out dynamic document, TraceWriter log)
{
document = current.GetBody<MyObject>();
log.Info($"C# ServiceBus queue triggered function processed the message and sent to cosmos");
}
}
这成功插入到 cosmos,但是更新时出现错误:
Microsoft.Azure.Documents.DocumentClintException: Entity with the specified id already exists in the system.
我尝试更新的关键是该集合的分区键。
我看到了这个问题:
但似乎我的用法与 Matias Quarantas 答案中的用法相似。他还提到使用 out 参数会导致 cosmos 上的 upsert。
如何创建这个 "upsert" 函数,同时仍然使用 azure 函数 1.x?
绑定确实执行了 Upsert 操作。
我创建了这个示例函数,它接受一个 Http 负载 (JSON) 并将其存储在 Cosmos DB as-is:
[FunctionName("Function1")]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
[DocumentDB("MyDb", "MyCollection", ConnectionStringSetting = "MyCosmosConnectionString")] out dynamic document,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
dynamic data = req.Content.ReadAsAsync<object>().GetAwaiter().GetResult();
document = data;
return req.CreateResponse(HttpStatusCode.OK);
}
如果我向 Http 端点发送 JSON 负载,输出绑定将按预期工作:
当我检查数据资源管理器时,我看到:
如果我发送第二个有效负载,这次添加一个 属性(相同的 ID):
Data Explorer 显示文档已更新,功能代码相同:
你能添加完整的Exception/Error跟踪吗?您的服务总线消息是否包含 "id"?您的 collection 分区了吗?
如果您的 collection 已分区并且您正在更改分区键 属性 的值,则绑定不会更新现有文档,它会创建一个新文档,因为更新插入操作将找不到现有文档(基于 id/partition 键)。但它不会抛出异常。
我有一个 azure 函数从 Azure 服务总线队列接收消息并将文档发送到 cosmosDB。我正在使用 Azure 函数 1.x:
public static class Function1
{
[FunctionName("Function1")]
public static void Run([ServiceBusTrigger("ServiceBusQueue", AccessRights.Manage, Connection = "ServiceBusQueueConnection")]BrokeredMessage current, [DocumentDB(
databaseName: "DBname",
collectionName: "Colname",
ConnectionStringSetting = "CosmosDBConnection")]out dynamic document, TraceWriter log)
{
document = current.GetBody<MyObject>();
log.Info($"C# ServiceBus queue triggered function processed the message and sent to cosmos");
}
}
这成功插入到 cosmos,但是更新时出现错误:
Microsoft.Azure.Documents.DocumentClintException: Entity with the specified id already exists in the system.
我尝试更新的关键是该集合的分区键。
我看到了这个问题:
如何创建这个 "upsert" 函数,同时仍然使用 azure 函数 1.x?
绑定确实执行了 Upsert 操作。
我创建了这个示例函数,它接受一个 Http 负载 (JSON) 并将其存储在 Cosmos DB as-is:
[FunctionName("Function1")]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
[DocumentDB("MyDb", "MyCollection", ConnectionStringSetting = "MyCosmosConnectionString")] out dynamic document,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
dynamic data = req.Content.ReadAsAsync<object>().GetAwaiter().GetResult();
document = data;
return req.CreateResponse(HttpStatusCode.OK);
}
如果我向 Http 端点发送 JSON 负载,输出绑定将按预期工作:
当我检查数据资源管理器时,我看到:
如果我发送第二个有效负载,这次添加一个 属性(相同的 ID):
Data Explorer 显示文档已更新,功能代码相同:
你能添加完整的Exception/Error跟踪吗?您的服务总线消息是否包含 "id"?您的 collection 分区了吗?
如果您的 collection 已分区并且您正在更改分区键 属性 的值,则绑定不会更新现有文档,它会创建一个新文档,因为更新插入操作将找不到现有文档(基于 id/partition 键)。但它不会抛出异常。