【发布时间】:2018-07-18 06:16:26
【问题描述】:
在运行新的 MongDB 服务器 3.6 版并尝试将 Change Stream 监视添加到集合以获取新插入和文档更新的通知时,我只收到更新通知,而不是插入通知。
这是我尝试添加手表的默认方式:
IMongoDatabase mongoDatabase = mongoClient.GetDatabase("Sandbox");
IMongoCollection<BsonDocument> collection = mongoDatabase.GetCollection<BsonDocument>("TestCollection");
var changeStream = collection.Watch().ToEnumerable().GetEnumerator();
changeStream.MoveNext();
var next = changeStream.Current;
然后我从 MongoDB 下载了 C# 源代码,看看他们是如何做到的。查看更改流监视的测试代码,他们创建了一个新文档(插入),然后立即更改该文档(更新),然后设置更改流监视以接收“更新”通知。 没有给出如何查看“插入”通知的示例。
我查看了 MongoDB 网站和 SO 上的 Java 和 NodeJS 示例,这似乎很简单,并且定义了一种查看插入和更新的方法:
var changeStream = collection.watch({ '$match': { $or: [ { 'operationType': 'insert' }, { 'operationType': 'update' } ] } });
C# 驱动程序的 API 大不相同,我原以为他们会为 C# 保留与 Java 和 NodeJS 相同的 API。我发现没有或很少有 C# 做同样事情的例子。
我最接近的是以下尝试,但仍然失败,并且 C# 版本的文档非常有限(或者我没有找到正确的位置)。设置如下:
String json = "{ '$match': { 'operationType': { '$in': ['insert', 'update'] } } }";
var options = new ChangeStreamOptions { FullDocument = ChangeStreamFullDocumentOption.UpdateLookup };
PipelineDefinition<ChangeStreamDocument<BsonDocument>, ChangeStreamDocument<BsonDocument>> pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<BsonDocument>>().Match(Builders<ChangeStreamDocument<BsonDocument>>.Filter.Text(json,"json"));
然后运行下面的语句会抛出异常:
{"命令聚合失败:$match 与 $text 只允许作为 第一个管道阶段。"}
也没有其他过滤器选项起作用,而且我还没有找到一种方法来输入 JSON 作为字符串来设置“操作类型”。
var changeStream = collection.Watch(pipeline, options).ToEnumerable().GetEnumerator();
changeStream.MoveNext();
var next = changeStream.Current;
我在这里的唯一目标是能够使用 C# 驱动程序设置“操作类型”。有谁知道我做错了什么或者使用 C# 驱动程序尝试过这个并取得了成功?
在阅读了大量的网页后,关于 C# 版本的 MongoDB 驱动程序的信息很少,我非常卡住! 任何帮助将不胜感激。
【问题讨论】:
标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0