从本地脚本中删除变量并加载现有数据库数据

时间:2020-08-13 04:19:42

标签: c# mongodb methods

说我们有一个PersonInfo类

PersonInfo{
public int age = 10;
public int weight = 150;
}

然后我将此数据上传到了我的Mongo数据库。

现在,说我不再需要了,所以我的PersonInfo类看起来像这样:

PersonInfo{
public int age = 10;
}

但是现在,当我从Mongo数据库加载时,它说: “ FormatException:元素“ weight”与PersonInfo类的任何字段或属性都不匹配。”

如何在不出现此错误的情况下删除类变量?

谢谢!

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决此问题,具体取决于您对数据的处理方式。

默认情况下,如您所见,如果驱动程序无法对所有bson文档属性进行反序列化,则驱动程序将引发异常,这样一来我们就不会导致数据丢失。

最简单的方法是向要反序列化的模型中添加一个ExtraElements属性,该属性可以是BsonDocumentIDictionary<string, object>

public class PersonInfo
{
    public ObjectId Id { get; set; }
    
    public int Age { get; set; }

    public BsonDocument ExtraElements { get; set; }
}

或者,我们可以通过两种方式忽略文档中的任何其他元素。

第一个是在我们的课程中添加一个BsonIgnoreExtraElements属性

[BsonIgnoreExtraElements]
public class PersonInfo
{
    public ObjectId Id { get; set; }
    
    public int Age { get; set; }
}

或者,我们可以在运行查询之前通过执行以下操作为代码中的PersonInfo创建一个类映射(这只需要执行一次,理想的是在应用程序启动时执行)。

BsonClassMap.RegisterClassMap<PersonInfo>(map =>
{
    map.AutoMap();
    map.SetIgnoreExtraElements(true);
});

下一种方法是,如果您想忽略与谓词匹配的所有或一系列类型中的多余元素。

在这里,我们使用的约定是在应用程序启动时设置的。

ConventionRegistry.Register("IgnoreExtraElements", new ConventionPack
{
    new IgnoreExtraElementsConvention(true)
}, t => true);

t => true谓词会将约定应用于所有类型。

相关问题