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

时间:2012-02-28 08:29:43

标签: c# mongodb mongodb-.net-driver

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

QueryDocument _document = new QueryDocument("key", "value");
MongoCursor<BsonDocument> _documentsReturned = _collection.FindAs<BsonDocument>(_document);

foreach (BsonDocument _document1 in _documentsReturned)
{
    //deserialize _document1
    //?
}

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

2 个答案:

答案 0 :(得分:67)

实际上有三种方式:

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;

对于大多数情况,你可以采用第一种方法。但有时,当您的文档非结构化时,您可能需要采用第三种方法。

答案 1 :(得分:0)

对于具有一些结构化数据的大型应用程序,建议在创建和获取数据时使用您的自定义模型,而不是使用 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);