这是我从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,而是用于我的集合中的所有文档。
感谢您的时间。
答案 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”而不会丢失您未映射的字段中的数据。