1

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

当我在我的类中重命名一个字段时,例如将字段名称从 Comment 更改为 Comments,并且我在我的类中进行了此更改,当我执行获取时,我从 Mongo 得到一个异常。

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

如果可能不进行 bson 和 .net 类之间的转换,将会很高兴。

4

1 回答 1

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);
});

如果您想要完全控制,这里还记录了更多选项。

于 2013-10-27T14:22:09.537 回答