DocumentDb / CosmoDb的Azure函数绑定参数

时间:2017-06-01 15:06:15

标签: azure azure-cosmosdb azure-functions azure-servicebus-queues

我有一个服务总线队列项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未找到的文件,并且我认为没有任何输入绑定服务总线队列消息,但是...... ..

2 个答案:

答案 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。我不确定如何创建它,但输入绑定似乎没问题。