如何在C#驱动程序中设置MongoDB Change Stream’ManageType’?

运行新的MongDB服务器版本3.6,并尝试将更改流监视添加到集合以获取新插入和文档更新的通知时,我只接收更新通知,而不是插入。

这是我尝试添加手表的默认方式:

IMongoDatabase mongoDatabase = mongoClient.GetDatabase("Sandbox"); IMongoCollection collection = mongoDatabase.GetCollection("TestCollection"); var changeStream = collection.Watch().ToEnumerable().GetEnumerator(); changeStream.MoveNext(); var next = changeStream.Current; 

然后我从MongoDB下载了C#源代码,看看他们是如何做到这一点的。 查看他们的更改流手表的测试代码,他们创建一个新文档(插入),然后立即更改该文档(更新),然后设置Change Stream手表以接收’更新’通知。 没有给出关于如何观察“插入”通知的示例。

我已经查看了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, ChangeStreamDocument> pipeline = new EmptyPipelineDefinition<ChangeStreamDocument>().Match(Builders<ChangeStreamDocument>.Filter.Text(json,"json")); 

然后运行以下语句会抛出exception:

{“命令聚合失败:$ match with $ text仅允许作为第一个管道阶段。”}

没有其他filter选项也有效,我还没有找到一种方法只需输入JSON作为字符串来设置’operationType’。

 var changeStream = collection.Watch(pipeline, options).ToEnumerable().GetEnumerator(); changeStream.MoveNext(); var next = changeStream.Current; 

我唯一的目标是能够使用C#驱动程序设置’operationType’。 有谁知道我做错了或者用C#驱动程序试过这个并且成功了吗?

在阅读了大量网页之后,关于MongoDB驱动程序的C#版本的信息非常少,我非常困难! 任何帮助将非常感激。

以下是我用于更新集合的代码示例Watch以检索除了文档更新之外的“事件”。

 IMongoDatabase sandboxDB = mongoClient.GetDatabase("Sandbox"); IMongoCollection collection = sandboxDB.GetCollection("TestCollection"); //Get the whole document instead of just the changed portion ChangeStreamOptions options = new ChangeStreamOptions() { FullDocument = ChangeStreamFullDocumentOption.UpdateLookup }; //The operationType can be one of the following: insert, update, replace, delete, invalidate var pipeline = new EmptyPipelineDefinition>().Match("{ operationType: { $in: [ 'replace', 'insert', 'update' ] } }"); var changeStream = collection.Watch(pipeline, options).ToEnumerable().GetEnumerator(); changeStream.MoveNext(); //Blocks until a document is replaced, inserted or updated in the TestCollection ChangeStreamDocument next = changeStream.Current; enumerator.Dispose(); 

EmptyPiplineDefinition … Match()参数也可以是:

 "{ $or: [ {operationType: 'replace' }, { operationType: 'insert' }, { operationType: 'update' } ] }" 

如果你想使用$或命令,或者

 "{ operationType: /^[^d]/ }" 

在那里扔一点正则表达式。 最后一个是说,我想要所有的operationTypes,除非它们以字母’d’开头。