如何将BsonDocument对象反序列化回类

本文关键字:反序列化 对象 BsonDocument | 更新日期: 2023-09-27 18:26:04

从服务器获取BsonDocument对象后,如何将其反序列化回类?

QueryDocument _document = new QueryDocument("key", "value");
MongoCursor<BsonDocument> _documentsReturned = _collection.FindAs<BsonDocument>(_document);
foreach (BsonDocument _document1 in _documentsReturned)
{
    //deserialize _document1
    //?
}

我是否使用BsonReader进行反序列化?

如何将BsonDocument对象反序列化回类

实际上有三种方法:

1.指定要在FindAs<> 中直接加载的类型

var docs = _collection.FindAs<MyType>(_document);

2.通过BsonSerializer:反序列化文档

BsonSerializer.Deserialize<MyType>(doc);

3.手动将bson文档映射到您的班级:

var myClass = new Mytype();
myClass.Name = bsonDoc["name"].AsString;

在大多数情况下,你可以接受第一种方法。但有时,当您的文档是非结构化的时,您可能需要第三种方法。

对于具有一些结构化数据的大型应用程序,建议在创建和获取数据时使用自定义模型,而不是使用BsonDocument。

创建模型是反序列化的重要步骤。

创建模型时需要记住的有用注释:

  • 在模型中添加id属性。尝试使用[BsonId]属性进行良好实践:
  • 创建一个注释为[BsonExtraElements]的属性,该属性将用于保存反序列化过程中发现的任何额外元素
  • 您可以使用[BsonElement]来指定elementName
  • [BsonIgnoreIfDefault]-初始化BsonIgnoreIfDefaultAttribute类的新实例

示例模型结构,其中我试图涵盖最大情况。为了更好的体系结构,我为_id属性创建了一个基类,但您也可以直接在MyModel类中使用。

    public abstract class BaseEntity
    {
        // if you'd like to delegate another property to map onto _id then you can decorate it with the BsonIdAttribute, like this
        [BsonId]
        public string id { get; set; }
    }
    public class MyModel: BaseEntity
    {
        [BsonElement("PopulationAsOn")]
        public DateTime? PopulationAsOn { get; set; }
    
        [BsonRepresentation(BsonType.String)]
        [BsonElement("CountryId")]
        public int CountryId { get; set; }
        [Required(AllowEmptyStrings = false)]
        [StringLength(5)]
        [BsonIgnoreIfDefault]
        public virtual string CountryCode { get; set; }
        [BsonIgnoreIfDefault]
        public IList<States> States { get; set; }
        [BsonExtraElements]
        public BsonDocument ExtraElements { get; set; }
    }

现在去沙漠化,直接使用你的模型,同时调用FindAsync,如下所示:

cursor = await _collection.FindAsync(filter, 
new FindOptions<MyModel, MyModel>() 
{ BatchSize = 1000, Sort = sort }, ct);