Mongo .net客户端架构演变错误

时间:2013-10-27 08:59:51

标签: c# .net mongodb

我正在使用mongo .net客户端并将集合用于对象功能。我在模式演变中遇到的问题

当我在我的类中重命名一个字段时,例如将注册字段名称从注释更改为注释,并且我在我的课程中进行了此更改,当我执行获取时,我从Mongo获得了一个例外。

我的期望是mongo客户端将忽略集合中存在的字段但在我的.net类中不存在。

如果没有在bson和.net类之间进行转换,

会很高兴。

1 个答案:

答案 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