每次插入新文档时更新另一个集合

时间:2018-10-12 13:17:11

标签: azure-cosmosdb

我有两个收藏。据我所读(如果我错了,请随时纠正我),则您无法在集合之间加入数据。因此,我正在寻找每次将文档添加到另一个集合时更新一个集合的最佳方法。让我们看一个简单的示例:

船只:

[
    {
        "name": "vessel1",
        "id":1,
        "latestReportId":null,
        "latestReportName":null
    },
    {
        "name": "vessel2",
        "id":2,
        "latestReportId":null,
        "latestReportName":null
    }
]

报告: 报告

[
    {
        "name": "Report1",
        "id":1
    },
    {
        "name": "Report1",
        "id":1
    }
]

我的第一个想法是使用触发器,但是我读到该触发器只能应用于当前分区。什么是正确的方法?我不是唯一想要集合之间关系的人:D

1 个答案:

答案 0 :(得分:2)

您可以在Azure Functions中使用Cosmos DB Trigger来同步两个集合。

触发器可以侦听一个集合中的更改,并在另一个集合中执行(更新/插入)数据。

完整的代码示例和说明在此article中,但是基本上,您可以创建触发器并将其与Output Binding绑定,如下所示:

public static async Task Run([CosmosDBTrigger(
    databaseName: "your-origin-database",
    collectionName: "your-origin-collection",
    ConnectionStringSetting = "your-origin-connectionstringsettings"
    ] IReadOnlyList<Document> documents,
    [CosmosDB("your-destination-database", 
    "your-destination-collection", 
    ConnectionStringSetting = "your-destination-connectionstringsettings")] IAsyncCollector<Document> saveDocuments,
    ILogger log)
{
    foreach (var doc in documents)
    {
        try
        {
            // do any transformation required to the original document
            await saveDocuments.AddAsync(doc); // You could also create a new document here based on information from the first one
        }
        catch(Exception ex)
        {
            log.LogError($"Failed to process document id {doc.Id}: {ex.Message}");
        }
    }
}