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

Dan*_*ieu 5 c# mongodb mongodb-.net-driver

我是 MongoDb 的新手,我正在尝试将嵌套在父文档中的文档数组序列化为特定的类对象。

我的文档对象如下所示:

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")
}
Run Code Online (Sandbox Code Playgroud)

所以基本上它是一个名为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
} 
Run Code Online (Sandbox Code Playgroud)

目前的行为

目前,该Project文档返回了一个序列化的Product.

期望的行为

我希望文档返回时带有 ProjectItems. 该类ProjectItems很简单:

[Serializable]
[BsonIgnoreExtraElements]
public class ProjectItem {
    public string Name { get; set; } 
    public string Description { get; set; 
    // .. a handful of Fields
}
Run Code Online (Sandbox Code Playgroud)

我的尝试

我尝试使用创建映射,但是,尽管已阅读有关映射的整个文档BsonClassMap,但我对此类类型还不够了解。我应该注意,我已经使用以前的开发人员的其他映射定义了这个类映射,并且确信它们会执行(单元测试)。

  BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
      cm.AutoMap();
      cm.SetDiscriminator("ProjectItem");
      cm.SetDiscriminatorIsRequired(true);
  });
Run Code Online (Sandbox Code Playgroud)

不幸的是,该文档仍然被序列化为Product.

我的问题

如何将这个嵌套的 Products 数组序列化为 ProjectItem 类数组?

Dan*_*ieu 1

所以答案非常简单......无论你存储它的类型是什么,你都想将其设置为鉴别器。

  BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
      cm.AutoMap();
      cm.SetDiscriminator("Product"); // <--- it was stored as a Product
      cm.SetDiscriminatorIsRequired(true);
  });
Run Code Online (Sandbox Code Playgroud)

让我们为我的 MongoDb 新手看另一个例子......如果您Product最初存储为您的对象,那么您的对象将在数据库中ProductDetails拥有一个。_t告诉_tMongoDb 它存储为什么类型。

所以你的对象可能看起来像这样:

"Products" : [ 
    { 
         "_t" : "ProductDetails",
         "_id" : ObjectId("56971340f3a4990d2c199853"),
         "ProductId" : null,
         "Name" : null,
         "Description" : null,
         // ... quite a few more properties
         "Properties" : null 
    }
]
Run Code Online (Sandbox Code Playgroud)

由于我们的产品以“ProductDetail”的鉴别器类型存储,因此我们将其序列化为 ProjectItem,如下所示:

  BsonClassMap.RegisterClassMap<ProjectItem>(cm => {
      cm.AutoMap();
      cm.SetDiscriminator("ProductDetails"); // <--- it was stored as a ProductDetails
      cm.SetDiscriminatorIsRequired(true);
  });
Run Code Online (Sandbox Code Playgroud)