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

本文关键字:定义 动态 实体 自己的 我自己 MongoDB | 更新日期: 2023-09-27 18:29:05

MongoDB新手。在VS2013中建立一个C#web项目。

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

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

在这篇"入门"文章中,因为使用自己的域类要容易得多,所以快速入门会假设你要这样做。建议制作我们自己的类,如:

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是要使用的模型,有没有适合初学者的好样本?

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

我很惊讶这个话题经常出现。。。本质上,这更像是一个"静态类型语言限制",而不是MongoDB问题:

无模式并不意味着你本身没有任何模式,它基本上意味着你不必提前告诉数据库你要存储什么它基本上是"代码优先"-代码只是像写入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;}
    // ...
}

该解决方案还可以使用多关键字来模拟大量索引,从而使对属性的查询速度相当快(尽管缺乏静态类型会使范围查询变得棘手)。参见

这真的取决于你的需要。如果您想要嵌套对象和静态类型,事情会比这复杂得多。再说一遍,这种数据结构的消费者(即前端或客户端应用程序)通常需要做出假设,以便于消化这些信息,因此通常不可能确保这种类型的安全。

其他选项包括确实使用BsonDocument,我觉得它过于侵入性,因为您使您的业务模型依赖于数据库驱动程序实现;或者使用像Key-Value0这样的公共基类,它可以由ProductAttributesShoes等类扩展。这个问题实际上围绕着整个系统设计——你知道编译时的属性吗?您的前端有房产价值的下拉列表吗?它们从哪里来?

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