如何使用Azure函数Cosmos DB触发器更新集合中的文档?

时间:2019-12-13 19:20:54

标签: azure azure-functions azure-cosmosdb azure-triggers

当他们在CosmosDB上创建时,我需要用其他docs(type2)中的数据更新某些docs(type1)。我决定使用JavaScript Azure函数和cosmosDBTrigger(无服务器Azure选项)。我在绑定表达式时遇到问题,以配置functions.json来获取与触发函数的doc-type2相关联的doc-type1。任何帮助都可能很棒。

CosmosDB doc-type1:

{
    "type": "type1"
    "id": "123",
    "serial" : "123",
    "lastconf": []
}

CosmosDB doc-type2:

{
    "type": "type2"
    "id": "qwe",
    "idtype1" : "123",
    "conf1":1
}

function.json

{
    "bindings": [{
        "name": "documents",
        "type": "cosmosDBTrigger",
        "direction": "in",
        "leaseCollectionName": "leases",
        "connectionStringSetting": "_DOCUMENTDB",
        "databaseName": "db",
        "collectionName": "dbDev",
        "createLeaseCollectionIfNotExists": true
    },
    {
      "name": "inputDocumentIn",
      "type": "cosmosDB",
      "databaseName": "db",
      "collectionName": "dbDev",
      "id": "{idtype1}", // sqlQuery ??
      "connectionStringSetting": "_DOCUMENTDB",
      "direction": "in"
  },
  {
      "name": "inputDocumentOut",
      "type": "cosmosDB",
      "databaseName": "db",
      "collectionName": "dbDev",
      "createIfNotExists": false,
      "connectionStringSetting": "_DOCUMENTDB",
      "direction": "out"
  } ]
}

index.js:

module.exports = async function(context, documents, inputDocumentIn, inputDocumentOut) {
   context.log('JavaScript trigger function processed a request.');

   if (!!documents && documents.length > 0) {

       context.log('Documents: ', documents);

       inputDocumentOut = inputDocumentIn;
       inputDocumentOut.lastconf = documents.conf1; //documents[i].conf1; ??

       context.log('inputDocumentOut: ', inputDocumentOut); 
   }
}

1 个答案:

答案 0 :(得分:3)

Cosmos DB触发器发送文档列表作为有效负载。由于内容是列表,而不是单个对象/文档,因此无法使用输入绑定(您的documents绑定)。

通过检查绑定配置,我注意到的另一件事是,输出绑定正在写入触发器正在侦听的相同容器/帐户,您正在有效地创建循环(编写的文档将再次触发函数)

在要触发功能,接收更改(documents)并生成输出的情况下,通常会遍历结果,然后将结果输出到其他容器中。如果确实需要将输出发送到同一集合,则需要添加一些逻辑来过滤module.exports = async function(context, documents, inputDocumentIn, inputDocumentOut) { context.log('JavaScript trigger function processed a request.'); if (!!documents && documents.length > 0) { context.log('Documents: ', documents); var documentsToSave = []; for(var i = 0; i < documents.length; i++) { var document = documents[i]; var documentToSave = {}; // process document, maybe assign property values to documentToSave from document documentsToSave.push(documentToSave); } inputDocumentOut = documentsToSave; } } 列表中的逻辑。

如果您需要执行查询,那么执行可能还需要作为循环的一部分进行,尽管没有绑定可以帮助您,但是您需要拥有Client并手动执行这些操作

将文档保存在输出绑定中,我想也需要在循环中进行(因为您希望在每个Function执行中保存多个文档)肯定可以使用数组:

{{1}}