C#中使用MongoDB ChangeStream检测指定字段是否变更
解决C#中MongoDB ChangeStream监听特定字段变更的问题
你遇到的异常是因为MongoDB .NET驱动无法将document.UpdateDescription.UpdatedFields.Names这个C#表达式转换为服务器端可执行的查询语法——UpdatedFields.Names是客户端对象的属性,并非MongoDB ChangeStream文档原生包含的字段。
在MongoDB的ChangeStream事件文档中,更新的字段信息存储在updateDescription.updatedFields对象中,该对象的键就是被更新的字段名。要过滤出status字段的变更,只需检查这个对象中是否存在status键即可。
修改后的过滤逻辑
替换你的CreatePipeline方法,添加针对status字段的过滤条件:
private static PipelineDefinition<ChangeStreamDocument<BsonDocument>, ChangeStreamDocument<BsonDocument>> CreatePipeline(string collectionName) { var filter = Builders<ChangeStreamDocument<BsonDocument>>.Filter.And( // 只监听Update操作 Builders<ChangeStreamDocument<BsonDocument>>.Filter.Eq(doc => doc.OperationType, ChangeStreamOperationType.Update), // 指定监听的集合 Builders<ChangeStreamDocument<BsonDocument>>.Filter.Eq(doc => doc.CollectionNamespace.CollectionName, collectionName), // 检查updateDescription.updatedFields中是否包含status字段 Builders<ChangeStreamDocument<BsonDocument>>.Filter.Exists(doc => doc["updateDescription"]["updatedFields"]["status"]) ); return new EmptyPipelineDefinition<ChangeStreamDocument<BsonDocument>>().Match(filter); }
原理说明
doc["updateDescription"]["updatedFields"]["status"]直接对应MongoDB ChangeStream文档的原生结构,驱动可以将其转换为服务器端能识别的查询。Exists过滤器会检查updateDescription.updatedFields对象中是否存在status这个键,只有当该字段被更新时才会触发事件。
可选扩展:同时监听Replace操作
如果需要同时捕获Replace类型的变更(替换文档也可能修改status字段),可以扩展OperationType的过滤条件:
Builders<ChangeStreamDocument<BsonDocument>>.Filter.In(doc => doc.OperationType, new[] { ChangeStreamOperationType.Update, ChangeStreamOperationType.Replace })
内容的提问来源于stack exchange,提问作者Vinicius Andrade
相关产品推荐
相关产品推荐

