无法获取 MongoDB 更改流文档以显示在观察程序服务中
Unable to get MongoDB Change stream documents to appear in a watcher service
我有一项服务需要监视 Mongo 数据库上的集合以在系统中创建更改。我已设法使用 C# 驱动程序建立与副本集的连接,并且我正在使用以下代码来测试更改流。
public async Task WatchLoopAsync()
{
var options = new ChangeStreamOptions
{
FullDocument = ChangeStreamFullDocumentOption.UpdateLookup,
};
using (var cursor = await _collection.WatchAsync(options))
{
_logger.LogInformation("Watching collection {String}",
_deployments.CollectionNamespace);
await cursor.ForEachAsync(changeStreamDocument =>
{
var document = changeStreamDocument.FullDocument;
_logger.LogInformation("Received document: {String}",
document.ToString());
});
}
}
出现第一个日志,说明它正在使用正确的命名空间监视集合。然后我将文档添加到集合中,希望看到一些日志为“已接收文档:...”但没有日志。
我遵循了文档 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 时使用骆驼大小写约定。
我有一项服务需要监视 Mongo 数据库上的集合以在系统中创建更改。我已设法使用 C# 驱动程序建立与副本集的连接,并且我正在使用以下代码来测试更改流。
public async Task WatchLoopAsync()
{
var options = new ChangeStreamOptions
{
FullDocument = ChangeStreamFullDocumentOption.UpdateLookup,
};
using (var cursor = await _collection.WatchAsync(options))
{
_logger.LogInformation("Watching collection {String}",
_deployments.CollectionNamespace);
await cursor.ForEachAsync(changeStreamDocument =>
{
var document = changeStreamDocument.FullDocument;
_logger.LogInformation("Received document: {String}",
document.ToString());
});
}
}
出现第一个日志,说明它正在使用正确的命名空间监视集合。然后我将文档添加到集合中,希望看到一些日志为“已接收文档:...”但没有日志。
我遵循了文档 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 时使用骆驼大小写约定。