无法获取 MongoDB 更改流文档以显示在观察者服务中

问题描述

我有一个服务需要在 Mongo DB 上观看集合以在系统中创建更改。我已设法使用 C# 驱动程序建立到副本集的连接,并且我正在使用以下代码来测试更改流。

.forall

出现的第一个日志表明它正在使用正确的命名空间监视集合。然后我将一个文档添加到集合中,希望看到一些日志为“收到的文档:...”但没有任何日志。

我遵循了文档 here 中给出的异步模式。

解决方法

试试下面的方法:

using (var cursor = await _collection.WatchAsync(options))
{
    _logger.LogInformation("Watching collection {String}",_collection.CollectionNamespace);

    while (await cursor.MoveNextAsync())
    {
        foreach (var csd in cursor.Current)
        {
            switch (csd.OperationType)
            {
                case ChangeStreamOperationType.Insert:
                case ChangeStreamOperationType.Update:
                case ChangeStreamOperationType.Replace:
                    var document = csd.FullDocument;
                    _logger.LogInformation("Modified document: {String}",document.ToString());
                    break;
                case ChangeStreamOperationType.Delete:
                    var id = csd.DocumentKey["_id"].ToString();
                    _logger.LogInformation("Deleted document: {String}",id);
                    break;
                case ChangeStreamOperationType.Invalidate:
                    _logger.LogInformation("collection dropeed or renamed")
                    break;
            }
        }
    }

如果您想要更简单的变更流实现,请查看 this

,

我的特定问题的解决方案是,由于 C# 中的属性大小写约定,更改流接收代码在无法将属性“名称”与“名称”的对象属性匹配时抛出异常。

>

为了解决这个问题,我使用了以下代码片段:

var conventionPack = new ConventionPack
{
    new CamelCaseElementNameConvention()
};
ConventionRegistry.Register("camelCase",conventionPack,t => true);

这会注册 DB 驱动程序以在将实体映射到 BSON 时使用驼峰大小写约定。