如何将嵌套的Document反序列化为特定的类对象?

时间:2017-04-01 21:04:40

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

我是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类数组?

1 个答案:

答案 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);
  });