繁体   English   中英

如何区分 Cosmos DB 更改提要中的插入和更新

[英]How to tell the difference between Insert and Update in Cosmos DB change feed

我确实从该资源中获得了 Cosmos DB 更改提要的代码示例

我能够成功编译并运行代码。

这是更改提要调用的代码

    private static async Task<ChangeFeedProcessor> StartChangeFeedProcessorAsync(
        CosmosClient cosmosClient,
        IConfiguration configuration)
    {
        string databaseName = "changefeedsample";// configuration["SourceDatabaseName"];
        string sourceContainerName = "source";// configuration["SourceContainerName"];
        string leaseContainerName = "leases";// configuration["LeasesContainerName"];

        Container leaseContainer = cosmosClient.GetContainer(databaseName, leaseContainerName);
        ChangeFeedProcessor changeFeedProcessor = cosmosClient.GetContainer(databaseName, sourceContainerName)
            .GetChangeFeedProcessorBuilder<ToDoItem>(processorName: "changeFeedSample", onChangesDelegate: HandleChangesAsync)
                .WithInstanceName("consoleHost")
                .WithLeaseContainer(leaseContainer)
                .Build();

        Console.WriteLine("Starting Change Feed Processor...");
        await changeFeedProcessor.StartAsync();
        Console.WriteLine("Change Feed Processor started.");
        return changeFeedProcessor;
    }

这是对更改提要采取的操作的代码

static async Task HandleChangesAsync(IReadOnlyCollection<ToDoItem> changes, CancellationToken cancellationToken)
        {
            Console.WriteLine("Started handling changes...");
            foreach (ToDoItem item in changes)
            {
                Console.WriteLine($"Detected operation for item with id {item.id}, created at {item.creationTime}.");
                // Simulate some asynchronous operation
                await Task.Delay(10);
            }

            Console.WriteLine("Finished handling changes.");
        }

我确实看到了如何在插入时触发操作; 但是,有没有办法判断是否对更新采取了行动。 有没有办法分辨哪个是哪个,从另一个中分辨出来。 有没有办法获得有关更新/添加数据的更多详细信息

非常感谢您提前

有没有办法分辨哪个是哪个

CosmosDb 更改提要通过向您发送文档的当前值来工作。 因此,您无法区分插入或编辑。

如果您只需要区分插入和编辑,那么您可以在您的对象中添加一个bool IsEdited字段,并在编辑文档时将其设置为 true。 这足以执行诸如要处理插入但忽略编辑的汇总/计数表之类的操作。

如果您还需要处理编辑,则需要检测多个编辑,而不仅仅是第一个。 在这种情况下,您将需要具有文档 ID 和上次修改时间 ( _ts ) 的第二个容器,并将传入的_ts与您已经看到的(如果有)进行比较。 您可能需要一个JavaScript 存储过程来以原子方式进行比较+更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM