C # - Изменить потоки в MongoDB с $ match - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь сузить потоки изменений в MongoDB до конкретного документа, соответствующего _id документа, поскольку у меня много документов в одной коллекции.Кто-нибудь знает, как это сделать в C # ?Вот последнее, что я пытался безрезультатно:

{
    var userID = "someIdHere";
    var match = new BsonDocument
    {
        {
            "$match",
            new BsonDocument
            {
                {"_id", userID}
            }
        }
    };
    var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<Class>>().Match(match);

    var options = new ChangeStreamOptions { FullDocument = ChangeStreamFullDocumentOption.UpdateLookup };
    var cursor = collection.Watch(pipeline, options).ToEnumerable();
    foreach (var change in cursor)
    {
        Debug.WriteLine(change.FullDocument.ToJson());
        Debug.WriteLine(change.ResumeToken + " " + change.OperationType);
    }
} 

Если я изменю курсор на то, что вы видите ниже, он работает, но возвращает мир и возвращает поток изменений, когда есть активность на любом из_id присутствует в документе.Это не то, ради чего я иду.

var cursor = collection.Watch().ToEnumerable();

1 Ответ

0 голосов
/ 08 июня 2018

После поиска вблизи и вдали я смог собрать воедино кусочки информации о других проблемах, которые я нашел в Интернете, и нашел решение, приведенное ниже.Он работает как чудо!

Я не только смог отфильтровать поток изменений, чтобы он распознавал только обновления, но я смог сузить поток до КОНКРЕТНОГО документа _id И сделал его еще более детальным, найдя конкретныйперейдите в поле с именем LastLogin для этого _id.Это то, что я хотел, так как поток изменений по умолчанию возвращал все обновления, произошедшие в коллекции.

Надеюсь, это поможет кому-то, кто столкнулся с той же проблемой, что и я.Ура.

{
    var db = client.GetDatabase(dbName);
    var collectionDoc = db.GetCollection<BsonDocument>(collectionName);
    var id = "someID";

    //Get the whole document instead of just the changed portion
    var options = new ChangeStreamOptions
    {
        FullDocument = ChangeStreamFullDocumentOption.UpdateLookup
    };

    //The operationType of update, where the document id in collection is current one and the updated field
    //is last login.
    var filter = "{ $and: [ { operationType: 'update' }, " +
                 "{ 'fullDocument._id' : '" + id + "'}" +
                 "{ 'updateDescription.updatedFields.LastLogin': { $exists: true } } ] }";

    var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<BsonDocument>>().Match(filter);

    var changeStream = collectionDoc.Watch(pipeline, options).ToEnumerable().GetEnumerator();

    try
    {
        while (changeStream.MoveNext())
        {
            var next = changeStream.Current;
            Debug.WriteLine("PRINT-OUT:" + next.ToJson());
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine("PRINT-OUT: " + ex);
    }
    finally
    {
        changeStream.Dispose();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...