При запуске нового сервера 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 #, я очень застрял! Любая помощь приветствуется.