我有一个服务总线队列项BrokeredMessage,包含以下正文:
{"MemberId":711918,"CampaignId":"214ade86-9167-40ba-a63a-9eeb57f893fa"}
方法如下:
public static async Task Run(BrokeredMessage myQueueItem, CampaignResult inputDocument, TraceWriter log)
我想看看该函数是否可以使用这样的绑定从cosmodb / documentdb中提取文档:
"bindings": [
{
"name": "myQueueItem",
"type": "serviceBusTrigger",
"direction": "in",
"queueName": "myqueue",
"connection": "myconnectionsb",
"accessRights": "Manage"
},
{
"type": "documentDB",
"name": "inputDocument",
"databaseName": "pmg-docdb-rd-test",
"collectionName": "JobResults",
"id": "{CampaignId}-{MemberId}",
"connection": "myconnection",
"direction": "in"
}
],
我似乎无法全力以赴。另外,我不确定如果文档不存在会发生什么,我希望inputDocument为null但是我不确定,这个想法是我想要的如果它不存在则创建它,如果存在则进行更新。由于文档说输入文档的任何更改都将保留,我认为更新将起作用....
错误是:命名参数CampaignId没有值
在摘要中,我是否可以让函数根据消息检索cosmodb文档,如果文档为null,则会创建它,否则会保留更改?
编辑:刚刚意识到如果文档不存在,docdb / cosmodb将返回404未找到的文件,并且我认为没有任何输入绑定服务总线队列消息,但是...... ..
答案 0 :(得分:2)
是的,你可以这样做,但是你需要绑定到POCO才能绑定到它的属性。
在您的情况下,这看起来类似于:
public class SomeClass
{
public string MemberId { get; set; }
public string CampaignId { get; set; }
}
然后,您可以更改函数方法以获取POCO,而不是BrokeredMessage
作为触发器的参数。 POCO中的属性将成为您可以绑定的命名输入。
答案 1 :(得分:1)
byte[] bytes = Encoding.UTF8.GetBytes(cr.ToJson());
MemoryStream stream = new MemoryStream(bytes, writable: false);
var msg = new BrokeredMessage(stream)
{
MessageId = "m-" + j + s.MemberID.ToString(),
ScheduledEnqueueTimeUtc = schedule,
ContentType = "application/json"
};
必须在function.json中提供PartitionKey(没有看到这个记录)。如果未找到,则记录的输入似乎为null。我不确定如何创建它,但输入绑定似乎没问题。