C# - Изменить потоки в MongoDB с $match
Я пытаюсь сузить потоки изменений в 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 ответ
После поиска близких и дальних мест я смог собрать воедино кусочки информации о других проблемах, которые я нашел в Интернете, и нашел решение ниже. Отлично работает!
Я не только смог отфильтровать поток изменений, чтобы он распознал только обновления, но и смог сузить поток до КОНКРЕТНОГО документа _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();
}
}