C# 如何为MongoDB定义类型

C# 如何为MongoDB定义类型,c#,mongodb,C#,Mongodb,对于像我这样做了大量SQL的人来说,C#项目让一家面包连锁店记录每个制作,包括配料和实际配方等,似乎有点太自由了。我想起了MongoDB。 从典型类型、数据库接口和存储库类开始,我意识到我已经习惯于将所有内容映射到一个类型类中,以定义每个属性/列。我选择MongoDB的原因是它无法确定到底有多少列。有时他们按照一定的顺序写东西,有时他们只是随意地写。不可能在类型中预先定义它们。当然,解决方法是组成20个属性/列,因为它们永远不会使用这么多。我知道MongoDB也有模式。但是,这种方式可以简单地回

对于像我这样做了大量SQL的人来说,C#项目让一家面包连锁店记录每个制作,包括配料和实际配方等,似乎有点太自由了。我想起了MongoDB。 从典型类型、数据库接口和存储库类开始,我意识到我已经习惯于将所有内容映射到一个类型类中,以定义每个属性/列。我选择MongoDB的原因是它无法确定到底有多少列。有时他们按照一定的顺序写东西,有时他们只是随意地写。不可能在类型中预先定义它们。当然,解决方法是组成20个属性/列,因为它们永远不会使用这么多。我知道MongoDB也有模式。但是,这种方式可以简单地回到通常的固定模式SQL

如果MongoDB仍然是数据库选择,C#可能有以下类型选项:

  • 将所有东西都捕捉到一根大绳中(制作和配方)
  • 稍微有点条理,缺点是它不能处理非对收集,例如水平3+字段
  • 面包店{
    int UserId,
    字符串用户名,
    Datetime makeTime,
    我的收集使,
    i收集配方
    }
    公开课制作
    {
    字符串字段名,
    字符串实际值
    }
    公共课食谱
    {
    字符串ingredientName,
    串剂量
    }
    
  • 每行/文档预定义多达20个字段,我宁愿回到SQL
  • 面包店{
    int UserId,
    字符串用户名,
    Datetime makeTime,
    我的收集使,
    i收集配方
    }
    公开课制作
    {
    字符串字段名1,字符串实际值1,
    ...
    字符串字段名20,字符串实际值20
    }
    公共课食谱
    {
    字符串INGREDIENTNAME 1,字符串dose1,
    ...
    字符串IngRadientName20,字符串dose20
    }
    

    必须能够查询项目和值(如果存在)。需要一些专家建议。谢谢。

    您只需将您的
    制作成
    字典
    收据


    请举个例子。

    据我所知,mongoDb的东西您使用的是第三部分,而不是使用fieldname1-fieldname20,只需使用另一个列表即可。因为它的保存方式非常类似于JSON对象,所以您不必绑定到行和列模式中的二维对象。如果您的类make由一个列表组成,其中每个字段都由字段和值成员组成,那么您可以灵活地将大量字段存储到数据库中。@Sebi很好。关键是要使它垂直而不是水平。我如何处理相关但非成对的事情?例如,配方、剂量和温度。我认为它完全是面向对象的。建立一个好的C#对象结构。稍后将其序列化到mongodb。但这只是我的观点,我从未尝试过。要保持关系,我认为您需要存储Mongo文档的Id字段@他们如此习惯于自由形式,人类从上下文中获得它,从不感到困惑,因为他们与众不同,数字的范围从不重叠。例如,他们写道:品牌A,糖,2(意味着勺子),300(意味着温度),20(意味着分钟)。这是一篇2013年的帖子。您知道现在是否支持列表吗?原因是它们如此习惯于自由形式,人类从上下文中获得它,永远不会感到困惑,因为它们是独特的,数字的范围永远不会重叠。例如,他们写道:品牌A,糖,2(意味着勺子),300(意味着温度),20(意味着分钟)。你可以看出他们没有钥匙。因为“糖”已经是整个文档的关键。在“sugar”之后要求字段的单位/剂量/标签会增加数据输入的开销。即使是2013年发布的,也不会使其错误或无效。支持列表。您可以始终将属性设置为字符串列表以实现此目的。将ExtraElements成员的Get类型更改为list from Dictionary时,必须为BsonDocument或Implemente IDictionary。如果您使用的是list,则不应使用BsonExtraElements批注。把它拿走。混合动力车怎么样?这是一个
    字典
    ,然后将对象填充为
    列表
    数组[]
    ,以保持顺序。
    Bakery{
    int UserId, 
    string UserName,
    Datetime makeTime,
    string make,
    string recipe
    }
    
    Bakery{
        int UserId, 
        string UserName,
        Datetime makeTime,
        iCollection<make> makes,
        iCollection<recipe> recipes
        }
    
    public class make
    {
    string fieldName,
    string actualValue
    }
    public class recipe
    {
    string ingredientName,
    string dose
    }
    
    Bakery{
        int UserId, 
        string UserName,
        Datetime makeTime,
        iCollection<make> makes,
        iCollection<recipe> recipes
        }
    
    public class make
    {
    string fieldName1, string actualValue1,
    ...
    string fieldName20, string actualValue20
    }
    public class recipe
    {
    string ingredientName1, string dose1,
    ...
    string ingredientName20, string dose20
    }