拥有Cosmos DB容器100%复制的最简单方法

时间:2020-10-14 11:01:41

标签: azure-cosmosdb

我希望Cosmos DB数据库中的两个不同容器始终都包含完全相同的数据。唯一的区别是容器的分区键。

最简单的方法是什么?我正在寻找一种几乎没有代码的方法,因此我不喜欢互联网似乎推荐的Data Factory解决方案。也许Azure中有另一项服务或第三方服务-也许可以通过简单的触发器来可靠地完成它?

编辑:澄清-我需要不断对其进行更新。一个容器是在正常使用期间更改所有数据的容器,而另一个容器应在发生这种情况时保持同步。

2 个答案:

答案 0 :(得分:2)

如果您不想编写自己的代码来执行此操作,则可以使用具有Cosmos DB Live Data Migrator的此存储库。

这可以通过Azure部署按钮进行部署。部署后,您可以打开网站并输入所有必需的信息。然后单击另一个按钮,它将使两个容器与不同的分区键保持同步。

答案 1 :(得分:1)

这是它的功能代码:

Total_SA = 
VAR insSA = CONVERT(SUBSTITUTE([Incremental SA], "RM", ""),INTEGER)
VAR refSA = CONVERT(SUBSTITUTE([Referral SA],"RM",""),INTEGER)


VAR PreviousRow =
    TOPN (
        1,
        FILTER (
            'Table',
            'Table'[Index] < EARLIER('Table'[Index]) && 
             'Table'[Pol No.] = EARLIER ( 'Table'[Pol No.])
        ),
        [Index], DESC
    )
 
VAR PreviousValue =  MAXX( PreviousRow,CONVERT(SUBSTITUTE('Table'[Referral SA], "RM", ""),INTEGER)  )  

RETURN  PreviousValue +    CONVERT(SUBSTITUTE('Table'[Incremental SA], "RM", ""),INTEGER) + 500

以及必须配置的设置 local.settings.json:

using System;
using System.Collections.Generic;
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace CosmosDBSyncFunction
{
    public static class SyncCosmosDb
    {
        [FunctionName(nameof(Sync))]
        public static void Sync(
            [CosmosDBTrigger(
                databaseName: "evaluation",
                collectionName: "lorem",
                ConnectionStringSetting = "cosmos-mm-eval",
                LeaseCollectionName = "leases",
                CreateLeaseCollectionIfNotExists=true
            )]IReadOnlyList<Document> input,
            [CosmosDB(
                databaseName: "evaluation",
                collectionName: "ipsum",
                ConnectionStringSetting = "cosmos-mm-eval")] IAsyncCollector< Document> output,
            ILogger log)

        {

            foreach(var item in input)
            {
                output.AddAsync(item);
            }
        }
    }
}