我正在尝试将MongoDB中的Change流缩小到与文档_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();
答案 0 :(得分:1)
在远近搜索之后,我能够将我在网上找到的其他问题中的一些信息拼凑起来,并提出了下面的解决方案。它就像一个魅力!
我不仅能够过滤变更流,因此它只能识别更新,但我能够将流缩小到SPECIFIC文档_id并使其更加精细地找到对该_id的名为LastLogin的字段的特定更改。这是我所期望的,因为默认的Change流返回了集合上发生的任何更新。
我希望这可以帮助遇到同样问题的人。欢呼声。
{
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();
}
}