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

时间:2018-02-07 20:20:40

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

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

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

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#源代码,看看他们是如何做到这一点的。查看他们的更改流手表的测试代码,他们创建一个新文档(插入),然后立即更改该文档(更新),然后设置Change Stream手表以接收更新&#39;通知。 没有举例说明如何观察&#39;插入&#39;通知。

我已经查看了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"));

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

  

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

其他任何过滤器选项都没有用,我还没有找到一种方法只需输入JSON作为字符串来设置&#39; operationType&#39;。

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

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

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

1 个答案:

答案 0 :(得分:1)

以下是我用于更新集合的代码示例Watch以检索&#34;事件&#34;不仅仅是文档更新。

IMongoDatabase sandboxDB = mongoClient.GetDatabase("Sandbox");
IMongoCollection<BsonDocument> collection = sandboxDB.GetCollection<BsonDocument>("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<ChangeStreamDocument<BsonDocument>>().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<BsonDocument> next = changeStream.Current;
enumerator.Dispose();

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

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

如果您想使用$或命令,或

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

在那里扔一点正则表达式。最后一个是说,我想要所有的操作类型,除非它们以字母&#39; d&#39;开头。