DocumentDb/CosmoDb 的 Azure 函数绑定参数

Azure Function Binding Parameters for DocumentDb/CosmoDb

我有一个服务总线队列项 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 没有值

总而言之,我能否让该函数根据消息检索 cosmdb 文档,如果该文档为空,则会创建它,否则会保留更改?

编辑:刚刚意识到 docdb/cosmodb returns 如果文档不存在则找不到 404,而且我认为服务总线队列消息没有任何输入绑定,然而.....

是的,您可以这样做,但是您需要绑定到 POCO 才能绑定到它的属性。

在您的情况下,这类似于:

public class SomeClass
{
    public string MemberId { get; set; }
    public string CampaignId { get; set; }
}

然后您可以更改您的函数方法以将您的 POCO 作为触发器的参数,而不是 BrokeredMessage。您的 POCO 中的属性将成为您可以绑定到的命名输入。

Fabio 的 post 帮助了我。代理消息必须像这样创建:

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(没有看到此记录)。如果找不到,记录的输入似乎为空。我不确定如何创建它,但输入绑定似乎没问题。