当前位置: 首页 > 知识库问答 >
问题:

如何用Azure函数Cosmos DB trigger更新集合中的一个doc?

梁新觉
2023-03-14

当他们在CosmosDB上创建时,我需要用其他文档(type2)的数据更新一些文档(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
}

函数. 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个答案

轩辕源
2023-03-14

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

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

如果您想触发一个函数,接收更改(文档),并生成一个输出,您通常会循环结果,并将结果输出到不同的容器中。如果确实需要将输出发送到同一个集合,则需要添加一些逻辑来过滤<code>文档

如果您需要执行查询,则执行可能还需要作为循环的一部分进行,但是没有绑定可以帮助您,但是您需要有一个客户端并手动执行这些操作。

在输出绑定中保存文档,我想也需要在循环中发生(因为您希望在每次函数执行中保存多个)当然可以使用数组:

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;
   }
}
 类似资料:
  • 下面代码会报 ts 错误,如何如何解决?

  • 我有多个云函数使用一个值,基本上是这样的: 问题是我想要更改页脚内容(由返回),但为了这样做(就我所研究的),我首先必须在代码中更改它,然后部署使用的每个云函数(和),这样页脚在每种类型的电子邮件上看起来都是一样的。 当然,我可以使用同时部署所有函数,但是我们曾经是多个开发人员,我们中的一些人将函数更新到我们不知道index.js中哪些函数与GCP中的相同(大约20个函数),我必须检查每一个函数,

  • 我有一个场景,我们将项目保存在一个documentDb集合中,例如在下。该文档类似于: 我在 下有第二个文档集合 该文档将看起来像这样: 上传此文档后,我希望触发一个触发器,将此新用户评分文档作为输入,能够从集合中检索相关文档,转换基于新数据的文档。 我的问题的关键是:如何在一个函数应用程序中触发一个文档的插入,以及如何从另一个集合中检索和修改一个文档? 我已经研究了以下链接,这些链接嘲笑了在Co

  • 我正在使用Azure函数V1 c#。我有一个时间触发的azure函数,它每秒都在检查我的数据库中的一些数据。如果找到了数据,我想对它执行一些操作。此操作可能需要30秒到5分钟的时间,具体取决于其上发生的操作。 > 当我的时间触发函数获取数据并开始对其执行操作时。在第一个操作完成之前,时间触发的函数不会再次执行。因此,即使时间触发函数被安排为每秒执行一次,如果上一次迭代中的操作花费了 30 秒,则在

  • 我大部分时间都用在我的计算数论研究上。我输入了以下内容: ,它给出了整数1到100的φ(n)-1的值。这里φ(n。它给出了以下输出: (我排除了一些整数以使问题简短)我想检查这些数字中是否有数字。我该怎么做?