将 BsonDocument 映射到 class 但出现错误
Mapping BsonDocument to class but getting error
这是我从 MongoDb collection 中提取的 BsonDocument。我想将其反序列化(或映射)为我在 C# 中创建的 object/class。
{
"_id" : ObjectId("5699715218a323101c663b9a"),
"type": null,
"text": "Hello this is text",
"user":
{
"hair": "brown",
"age": 64
}
}
这是我想要 map/deserialize BsonDocument 的 class。我的 class 中的字段是我唯一想要检索的字段。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
目前这就是我尝试执行此操作的方式,但我收到 "Element 'type' does not match any field or property of class MyType" 的错误。我不想在 MyType class.
中包含 "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 object 的一个实例只对一个文档执行此操作。我也对如何将整个 collection 反序列化为 MyType object 列表或类似的东西感兴趣,它不仅适用于一个 BsonDocument,还适用于我 [=31= 中的所有文档].
感谢您的宝贵时间。
BsonIgnoreExtraElements
使用 [BsonIgnoreExtraElements]
属性标记您的 class。如果 class 属性和 mongo 记录之间没有 1:1 匹配,这将告诉 c# 驱动程序不要惊慌失措。
[BsonIgnoreExtraElements]
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
使用这种方法,类型和用户属性将被忽略。
为额外的元素添加一个"catch all"属性
如果您不想忽略这些元素,那么您可以添加一个 catch all 属性,它将在 bson 文档中包含所有额外的 "undeclared" 属性。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
[BsonExtraElements]
public BsonDocument CatchAll { get; set; }
}
使用这种方法,类型和用户将作为 .CatchAll 的属性存在 属性。
有什么好处?
一个很大的优势是您可以对后者执行 "findAndReplace" 而不会丢失您未映射的字段中的数据。
这是我从 MongoDb collection 中提取的 BsonDocument。我想将其反序列化(或映射)为我在 C# 中创建的 object/class。
{
"_id" : ObjectId("5699715218a323101c663b9a"),
"type": null,
"text": "Hello this is text",
"user":
{
"hair": "brown",
"age": 64
}
}
这是我想要 map/deserialize BsonDocument 的 class。我的 class 中的字段是我唯一想要检索的字段。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
目前这就是我尝试执行此操作的方式,但我收到 "Element 'type' does not match any field or property of class MyType" 的错误。我不想在 MyType class.
中包含 "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 object 的一个实例只对一个文档执行此操作。我也对如何将整个 collection 反序列化为 MyType object 列表或类似的东西感兴趣,它不仅适用于一个 BsonDocument,还适用于我 [=31= 中的所有文档].
感谢您的宝贵时间。
BsonIgnoreExtraElements
使用 [BsonIgnoreExtraElements]
属性标记您的 class。如果 class 属性和 mongo 记录之间没有 1:1 匹配,这将告诉 c# 驱动程序不要惊慌失措。
[BsonIgnoreExtraElements]
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
使用这种方法,类型和用户属性将被忽略。
为额外的元素添加一个"catch all"属性
如果您不想忽略这些元素,那么您可以添加一个 catch all 属性,它将在 bson 文档中包含所有额外的 "undeclared" 属性。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
[BsonExtraElements]
public BsonDocument CatchAll { get; set; }
}
使用这种方法,类型和用户将作为 .CatchAll 的属性存在 属性。
有什么好处?
一个很大的优势是您可以对后者执行 "findAndReplace" 而不会丢失您未映射的字段中的数据。