我是MongoDb的新手,我正在尝试将嵌套在父文档中的Documents数组序列化为特定的类对象。
我的文档对象如下所示:
Project
{
"_id" : ObjectId("589da20997b2ae4608c99173"),
// ... additional fields
"Products" : [
{
"_id" : ObjectId("56971340f3a4990d2c199853"),
"ProductId" : null,
"Name" : null,
"Description" : null,
// ... quite a few more properties
"Properties" : null
}
],
"CreatorUserId" : LUUID("af955555-5555-5555-5555-f1fc4bb7cfae")
}
所以基本上它是一个名为Project
的文档,它包含一个Product
文档的嵌套数组。
以下是当前类的内容:
public class Project : BaseClasses {
public ObjectId ParentCreatorUserIdProject { get; set; }
// ... additional Fields
public IEnumerable<IProjectItem> ProjectItems { get; set; }
//public IEnumerable<IProductDetails> Products { get; set; }
}
[DataContract][Serializable]
[BsonIgnoreExtraElements][MongoCollection("products")]
public class Product {
public string Name { get; set; }
public string Description { get; set;
// .. a bunch of Fields
}
目前,Project
文档带有序列化数组Product
。
我希望Document能够以ProjectItems
的序列化数组返回。 ProjectItems
类很简单:
[Serializable]
[BsonIgnoreExtraElements]
public class ProjectItem {
public string Name { get; set; }
public string Description { get; set;
// .. a handful of Fields
}
我曾尝试使用BsonClassMap
创建映射,但是,尽管已阅读entire document on mapping,但我对此类类型还不太了解。我应该注意到,我已经使用之前的开发人员其他映射定义了这个类映射,并且确定(单元测试)它们已执行。
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("ProjectItem");
cm.SetDiscriminatorIsRequired(true);
});
不幸的是,文档仍然被序列化为Product
。
如何将这个嵌套的Products数组序列化为ProjectItem类数组?
答案 0 :(得分:0)
所以答案结果非常简单......你存储的是什么类型,你想要设置为你的鉴别器。
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("Product"); // <--- it was stored as a Product
cm.SetDiscriminatorIsRequired(true);
});
让我们看一下MongoDb新手的另一个例子......如果您的Product
最初存储为ProductDetails
,您的对象在数据库中会有_t
。 _t
告诉MongoDb它存储的类型。
所以你的对象看起来像这样:
"Products" : [
{
"_t" : "ProductDetails",
"_id" : ObjectId("56971340f3a4990d2c199853"),
"ProductId" : null,
"Name" : null,
"Description" : null,
// ... quite a few more properties
"Properties" : null
}
]
由于我们的产品存储了鉴别器类型&#34; ProductDetail&#34;,我们将其序列化为如下的ProjectItem:
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("ProductDetails"); // <--- it was stored as a ProductDetails
cm.SetDiscriminatorIsRequired(true);
});