gpt4 book ai didi

c# - 将 BsonDocument 映射到类但出现错误

转载 作者:可可西里 更新时间:2023-11-01 09:58:56 27 4
gpt4 key购买 nike

这是我从 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 类中包含“类型”字段。

 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,还适用于我集合中的所有文档。

感谢您的宝贵时间。

最佳答案

BsonIgnoreExtraElements

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

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

使用这种方法,类型和用户属性将被忽略。

为额外元素添加“catch all”属性

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

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

使用这种方法,类型和用户将作为 .CatchAll 属性的属性存在。

有什么优势?

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

关于c# - 将 BsonDocument 映射到类但出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34830112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com