Mongodb自定义映射

时间:2018-08-15 14:42:42

标签: c# mongodb

我正在尝试开发一个具有两个主要域实体的应用程序:EntryCategory,并且我将使用mongodb。我将有一个条目集和一个类别集。条目集合可能有成千上万的文档,而类别有数百。

在我看来,我想显示所有条目的信息及其类别名称和颜色。我想保留其类别ID,以便在类别名称或颜色更改时可以更新受影响的条目。所以我想要一个这样的文件:

{
  "_id": 123456,
  "date": '2018-08-15',
  "description": "Some entry description"
  ....
  category:
  {
    "id": 123,
    "name": "My category",
    "color:" "blue"
  }

问题在于Category拥有更多的属性,因此我的文档最终像这样:

{
    "_id": 123456,
    "date": '2018-08-15',
    "description": "Some entry description"
     ....
    category:
    {
       "id": 123,
        "name": "My category",
        "color": "blue",
        "otherProp": "a",
        "anotherProp": "b",
        "differentProp": "c"
    }
}

我尝试使用BsonClassMap.RegisterClassMap来仅映射Category集合的Entry的某些属性,但这似乎是不可能的。如果我忽略某些Category属性,则category`集合也不会包含这些被忽略的项。

我应该使用像波纹管这样的不同模型表示形式还是创建新实体来按需保存信息(这样我的存储库就不会Entry持久保存,而会EntryDataObject持久保存)?

public class Entry {
   public string Description { get; set; }
   ...
   public Category Category { get; set; }
}

public class Category { 
   public string Name { get; set; }
   public string Color { get; set; }
}

public class CategoryExtraInformation {
   public string OtherProp { get; set; }
   public string AnotherProp { get; set; }
   public string DifferentProp { get; set; }
   public Category Category { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我现在正面临类似的问题。装饰器(即[忽略])也无法正确解决我的用例,因为它们会影响使用该类的所有地方。

我正在使用的解决方案是提供辅助函数(和/或构造函数),这些函数可以使用适当的属性子集来创建类。

例如,设置一个构造函数以构建一个仅包含嵌入式实例所需属性的新对象……假设您有一个名为category的Category类的“完全成熟”实例。现在,您要更新或创建Entry实例。如果您的作用域构造函数有限

public Category(int ID, string name, string color)
{
    id = ID;
    Name = name;
    Color = color
}

然后可以调用它来创建一个新的Category对象,该对象具有如下所示的受限字段:

var categoryLimited = new Category(category.id, category.Name, category.Color);

现在使用categoryLimited在Mongo中执行保存或更新操作。 MongoDB记录将仅包含所需的属性。显然,此方法将限于“额外属性”中没有默认值或必填字段的类。

祝你好运!