MongoDB:如何在我自己的域类中定义动态实体?

时间:2014-11-05 03:37:29

标签: c# mongodb dynamic

MongoDB新手。在VS 2013中设置C#Web项目。

需要将数据作为文档插入MongoDB。每次Key-Value对的数量可能不同。

例如,
  document 1: Id is "1",数据是一对键值:"order":"shoes"
  document 2: Id is "2",数据是3对键值:"order":"shoes", "package":"big", "country":"Norway"

在这" Getting Started"说因为使用你自己的域类更加容易,这个快速入门会假设你会这样做。建议让我们自己的班级像:

public class Entity
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}

然后使用它:

var entity = new Entity { Name = "Tom" };
...
entity.Name = "Dick";
collection.Save(entity);

嗯,它违背了无固定列的想法,对吗?

所以,我猜BsonDocument是使用的模型,是否有适合初学者的好样本?

1 个答案:

答案 0 :(得分:1)

我很惊讶这个主题的出现频率......基本上,这更像是一种静态类型的语言限制'而不是MongoDB问题:

Schemaless并不意味着您本身没有任何架构,这基本上意味着您不必事先告诉数据库 您所拥有的内容去商店。 它基本上是"代码优先" - 代码只是写入数据库,就像RAM一样,具有所有的灵活性。

当然,典型的应用程序将以某种方式具有某种类型的重复数据结构,某些类,一些面向对象的范例。对于索引也是如此:索引(通常)是静态的'在某种意义上,你必须告诉mongodb关于哪个字段要预先编制索引。

但是,还有一个用例,您不知道要存储什么。如果您的数据确实是不可预测的,那么首先考虑代码是有道理的:您会在C#中做些什么?你会使用BsonDocument吗?可能不是。也许嵌入式Dictionary可以解决问题,例如

public class Product {
    public ObjectId Id {get;set;}
    public decimal Price {get;set;}
    public Dictionary<string, string> Attributes {get;set;}
    // ...
}

此解决方案还可以与multikeys to simulate a large number of indexes一起使用,以便合理地快速查询属性(尽管缺少静态类型会使范围查询变得棘手)。见

这实际上取决于您的需求。如果你想拥有嵌套对象和静态类型,事情会比这复杂得多。然后,这种数据结构的消费者(即前端或客户端应用程序)通常需要做出能够轻松消化这些信息的假设,因此无论如何通常都不可能使这种类型安全。

其他选项包括确实使用BsonDocument,我觉得你的商业模式依赖于数据库驱动程序实现,这种侵入性太具侵略性;或使用像ProductAttributes这样的公共基类,可以通过ProductAttributesShoes等类扩展。这个问题实际上围绕整个系统设计 - 你知道编译时的属性吗?您是否有前端属性值的下拉菜单?它们来自哪里?

如果您想要可重用且灵活的东西,您可以简单地使用JSON库,将对象序列化为字符串并将其存储到数据库中。在任何情况下,与C#端的这些对象的交互都会很难看,因为它们不是静态类型的。