如何将嵌套的文档反序列化为特定的 class 对象?
How to deserialize a nested Document into a specific class object?
我是 MongoDb 的新手,我正在尝试将嵌套在父文档中的文档数组序列化为特定的 class 对象。
我的文档对象如下所示:
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
个文档的嵌套数组。
以下是当前 class 的样子:
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
.
的序列化数组
期望的行为
我希望文档返回一个 ProjectItems
的序列化数组。 ProjectItems
class 很简单:
[Serializable]
[BsonIgnoreExtraElements]
public class ProjectItem {
public string Name { get; set; }
public string Description { get; set;
// .. a handful of Fields
}
我的尝试
我曾尝试使用 BsonClassMap
创建映射,但是,尽管阅读了 entire document on mapping,但我对这种 class 类型的了解还不够。我应该注意,我已经定义了这个 class 映射与以前的开发人员其他映射,并且确信(单元测试)它们执行了。
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("ProjectItem");
cm.SetDiscriminatorIsRequired(true);
});
不幸的是,文档仍然被序列化为 Product
.
的数组
我的问题
如何将这个嵌套的 Products 数组序列化为 ProjectItem classes 数组?
所以答案非常简单...无论您将其存储为哪种类型,您都希望将其设置为鉴别器。
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
}
]
由于我们的 Product 存储的鉴别器类型为 "ProductDetail",因此我们将其序列化为 ProjectItem,如下所示:
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("ProductDetails"); // <--- it was stored as a ProductDetails
cm.SetDiscriminatorIsRequired(true);
});
我是 MongoDb 的新手,我正在尝试将嵌套在父文档中的文档数组序列化为特定的 class 对象。
我的文档对象如下所示:
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
个文档的嵌套数组。
以下是当前 class 的样子:
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
.
期望的行为
我希望文档返回一个 ProjectItems
的序列化数组。 ProjectItems
class 很简单:
[Serializable]
[BsonIgnoreExtraElements]
public class ProjectItem {
public string Name { get; set; }
public string Description { get; set;
// .. a handful of Fields
}
我的尝试
我曾尝试使用 BsonClassMap
创建映射,但是,尽管阅读了 entire document on mapping,但我对这种 class 类型的了解还不够。我应该注意,我已经定义了这个 class 映射与以前的开发人员其他映射,并且确信(单元测试)它们执行了。
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("ProjectItem");
cm.SetDiscriminatorIsRequired(true);
});
不幸的是,文档仍然被序列化为 Product
.
我的问题
如何将这个嵌套的 Products 数组序列化为 ProjectItem classes 数组?
所以答案非常简单...无论您将其存储为哪种类型,您都希望将其设置为鉴别器。
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
}
]
由于我们的 Product 存储的鉴别器类型为 "ProductDetail",因此我们将其序列化为 ProjectItem,如下所示:
BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
cm.AutoMap();
cm.SetDiscriminator("ProductDetails"); // <--- it was stored as a ProductDetails
cm.SetDiscriminatorIsRequired(true);
});