Как установить MongoDB Change Stream 'OperationType' в драйвере C #?

При запуске нового сервера 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;

Затем я загрузил исходный код C # из MongoDB, чтобы посмотреть, как они это сделали. Глядя на свой тестовый код для отслеживания потоков изменений, они создают новый документ (Insert), а затем сразу же изменяют этот документ (Update) и ЗАТЕМ настраивают часы Change Stream для получения уведомления об обновлении. Не приведен пример того, как отслеживать «вставные» уведомления.

Я просмотрел примеры Java и NodeJS как на веб-сайте MongoDB, так и на SO, который кажется простым и определяет способ просмотра как вставок, так и обновлений:

var changeStream = collection.watch({ '$match': { $or: [ { 'operationType': 'insert' }, { 'operationType': 'update' } ] } });

API для драйвера C # сильно отличается, я бы предположил, что они сохранят тот же API для C #, что и Java и NodeJS. Я не нашел или нашел очень мало примеров того, как 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 в виде строки для установки 'operationType'.

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

Моя единственная цель здесь - иметь возможность установить OperationType с помощью драйвера C #. Кто-нибудь знает, что я делаю неправильно, или пробовал это с помощью драйвера C # и добился успеха?

Прочитав большое количество веб-страниц с очень небольшим количеством информации о версии драйвера MongoDB для C #, я очень застрял! Любая помощь приветствуется.


person Michael Westberg    schedule 07.02.2018    source источник


Ответы (1)


Вот образец кода, который я использовал для обновления коллекции Watch для получения «событий», отличных от просто обновлений документов.

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]/  }"

чтобы добавить туда немного регулярного выражения. Последний говорит, что мне нужны все типы операций, если они не начинаются с буквы «d».

person Jerren Saunders    schedule 08.02.2018
comment
Большой! Спасибо, отлично работает. К сожалению, эти вещи не полностью задокументированы в MongoDB. Ваше решение близко к моему неработающему, я желаю, чтобы в будущем при подобных проблемах обновилась документация, чтобы отразить все эти функции драйвера MongoDB. Цените помощь! - person Michael Westberg; 12.02.2018