将BsonDocument映射到类但收到错误

时间:2016-01-16 17:47:03

标签: c# asp.net mongodb bson mongodb.driver

这是我从MongoDb集合中提取的BsonDocument。我想将此反序列化(或映射)到我在C#中创建的对象/类。

{
  "_id" : ObjectId("5699715218a323101c663b9a"),
  "type": null,
  "text": "Hello this is text",
  "user": 
    {
      "hair": "brown",
      "age": 64
    }     
}

这是我想要将BsonDocument映射/反序列化的类。我班上的字段是我唯一想要检索的字段。

    public class MyType
    {
        public BsonObjectId _id { get; set; }
        public BsonString text { get; set; }
    }

目前我正在尝试这样做,但我收到的错误是“元素'类型'与MyType类的任何字段或属性都不匹配”。我不想在MyType类中包含“type”字段。

 var collection = db.GetCollection<BsonDocument>("data_of_interest");
 var filter = new BsonDocument();
 var myData = collection.Find(filter).FirstOrDefault();
 MyType myObject = BsonSerializer.Deserialize<MyType>(myData);

我在最后一行收到错误。在这个例子中,我试图只为一个文档到MyType对象的一个​​实例执行此操作。我也对如何将整个集合反序列化为MyType对象的列表或类似的东西感兴趣,其中它不是仅用于一个BsonDocument,而是用于我的集合中的所有文档。

感谢您的时间。

1 个答案:

答案 0 :(得分:5)

<强> BsonIgnoreExtraElements

使用[BsonIgnoreExtraElements]属性标记您的课程。如果您的类属性和mongo记录之间没有1:1的匹配,那将告诉c#驱动程序不要惊慌失措。

[BsonIgnoreExtraElements]
public class MyType
{
    public BsonObjectId _id { get; set; }
    public BsonString text { get; set; }
}

使用此方法,将忽略类型和用户属性。

为额外元素添加“全部捕获”属性

如果您不想忽略这些元素,那么您可以添加一个catch属性,它将在bson文档中包含所有额外的“未声明”属性。

public class MyType
{
    public BsonObjectId _id { get; set; }
    public BsonString text { get; set; }
    [BsonExtraElements]
    public BsonDocument CatchAll { get; set; }
}

使用此方法,type和user将作为.CatchAll属性的属性存在。

有什么优势?

一个很大的优点是您可以使用后者执行“findAndReplace”而不会丢失您未映射的字段中的数据。