【发布时间】:2018-04-10 19:36:33
【问题描述】:
由于我应用到我的变更流的过滤器(在 SO:How do you filter updates to specific fields from ChangeStream in MongoDB 讨论),我得到的是 BsonDocument 而不是 ChangeStreamDocument 对象。此 BsonDocument 与 ChangeStreamDocument 的唯一不同之处在于它包含一个名为“tmpfields”的额外元素。
在我的场景中,我仍然需要 ResumeToken 和文档中的其他元素,所以我想将此 BsonDocument 转换为 ChangeStreamDocument 对象。我的第一次尝试是使用BsonSerializer.Deserialize<ChangeStreamDocument<BsonDocument>>( doc),其中 doc 是我返回的 BsonDocument。但是,因为它有额外的 tmpfields 元素,所以这是不允许的。
我尝试注册 BsonClassMap,因为 ChangeStreamDocument 类是 C# 驱动程序的一部分,我无法将 [BsonIgnoreExtraElements] 属性添加到该类,但我没有成功:
BsonClassMap.RegisterClassMap<ChangeStreamDocument<BsonDocument>>(cm =>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
});
虽然AutoMap() 不起作用,但我收到了关于“找不到匹配的创建者”的异常。我尝试cm.MapCreator(...),但也没有成功。我调用了AutoMap()(只留下了 SetIgnoreExtraElements 行)并得到了关于它无法匹配属性(_id 等)的错误。所以我对每个属性都尝试了cm.MapProperty(c => c.DocumentKey).SetElementName("documentKey") 这样的行,但是当我使用Deserialize() 方法时它们从未设置过——它们被保留为空。
目前,我已恢复使用 doc["field"].AsXYZ 方法从 BsonDocument 获取我需要的值,但我想学习一种更好的方法来做到这一点。
使用 RegisterClassMap 是正确的方法吗?如果是这样,我错过了什么?
【问题讨论】:
标签: c# mongodb mongodb-.net-driver