如何从服务器获取BsonDocument对象后将其反序列化回来?
QueryDocument _document = new QueryDocument("key", "value");
MongoCursor<BsonDocument> _documentsReturned = _collection.FindAs<BsonDocument>(_document);
foreach (BsonDocument _document1 in _documentsReturned)
{
//deserialize _document1
//?
}
我是否使用BsonReader进行反序列化?
答案 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);