我正在使用mongo .net客户端并将集合用于对象功能。我在模式演变中遇到的问题
当我在我的类中重命名一个字段时,例如将注册字段名称从注释更改为注释,并且我在我的课程中进行了此更改,当我执行获取时,我从Mongo获得了一个例外。
我的期望是mongo客户端将忽略集合中存在的字段但在我的.net类中不存在。
如果没有在bson和.net类之间进行转换,会很高兴。
答案 0 :(得分:2)
如果您想继续使用旧名称,可以使用BsonElement
属性:
class Demo {
[BsonElement("Comment")]
public string Comments { get; set; }
}
使用该语法将告诉MongoDB C#驱动程序在名为Comments
的字段中的文档字段中查找Comment
属性/字段的数据。这意味着您无需担心从旧位置移动/复制数据。它经常被使用,以便您可以在源代码中使用更长的友好名称,同时最小化实际的BSON文档大小(因为完整的属性名称始终存储在数据库集合中的文档中)。缩短时,您可以使用:
[BsonElement("c")]
public string Comments { get; set; }
某些MongoDB驱动程序没有此功能(我希望他们这样做!)。
其次,你也可以在你的类中添加一个特殊属性,忽略该类的所有未知元素,而不是抛出异常:
[BsonIgnoreExtraElements]
public Demo {
public string Comments { get; set; }
}
然后,如果找到名为Comment
的字段,但无法与C#类的属性匹配,则将忽略该字段。我会经常在开发过程中使用它,因为架构会更改,但之后会将其删除,以便我可以捕获意外的字段。
或者您也可以使用BsonClassMap
进行类似的更改:
BsonClassMap.RegisterClassMap<Demo>(cm => {
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
});
如果您想要完全控制,甚至可以记录更多选项here。