Rod*_*era 2 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
}
}
Run Code Online (Sandbox Code Playgroud)
这是我想映射/反序列化BsonDocument的类。我班级中的字段是我要检索的唯一字段。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当前,这就是我试图这样做的方式,但是我收到一个错误,指出“元素'类型'与类MyType的任何字段或属性都不匹配”。我不想在MyType类中包括“类型”字段。
var collection = db.GetCollection<BsonDocument>("data_of_interest");
var filter = new BsonDocument();
var myData = collection.Find(filter).FirstOrDefault();
MyType myObject = BsonSerializer.Deserialize<MyType>(myData);
Run Code Online (Sandbox Code Playgroud)
我在最后一行遇到了错误。在此示例中,我尝试仅对MyType对象的一个实例的一个文档执行此操作。我还对如何将整个集合反序列化为MyType对象或类似对象的列表感兴趣,该对象不仅针对一个BsonDocument,而且针对我的集合中的所有文档。
谢谢你的时间。
BsonIgnoreExtraElements
使用[BsonIgnoreExtraElements]属性标记您的班级。如果您的类属性和mongo记录之间没有1:1的匹配,这将告诉c#驱动程序不要惊慌。
[BsonIgnoreExtraElements]
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,类型和用户属性将被忽略。
为其他元素添加“全部捕获”属性
如果您不想忽略这些元素,则可以添加一个catch all属性,该属性将在bson文档中容纳所有额外的“未声明”属性。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
[BsonExtraElements]
public BsonDocument CatchAll { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,类型和用户将作为.CatchAll属性的属性存在。
有什么优势?
一个很大的优点是您可以对后者执行“ findAndReplace”操作,而不会丢失未映射字段中的数据。
| 归档时间: |
|
| 查看次数: |
2725 次 |
| 最近记录: |