MongoDB C#驱动程序 - POCO引用的序列化?

时间:2011-07-01 22:18:34

标签: c# mongodb mongodb-.net-driver

我正在研究MongoDB。据我所知,官方C#驱动程序可以执行POCOs的序列化和反序列化。我还没有找到的信息是如何序列化两个对象之间的引用。 [我说的是一些可以用两个单独的文件表示的东西,带有ID链接,而不是嵌入的文件。

序列化机制可以处理这种情况吗? (1):

class Thing {
    Guid Id {get; set;}
    string Name {get; set;}
    Thing RelatedThing {get; set;}
}

或者我们是否必须牺牲一些OOP,并做这样的事情? (2):

class Thing {
    Guid Id {get; set;}
    string Name {get; set;}
    Guid RelatedThing_ID {get; set;}
}

更新

然后只是几个相关的问题......

a)如果序列化程序能够处理情况(1)。如何在不使用嵌入的情况下执行此操作的示例是什么?

b)如果使用嵌入,是否可以查询所有“事物”,无论它们是“父母”还是嵌入元素?这样的查询怎么样?

4 个答案:

答案 0 :(得分:11)

C#驱动程序可以处理序列化包含对其自身另一个实例的引用的类(1)。但是:

  1. 正如你推测的那样,它将使用嵌入来表示这个
  2. 对象图中必须没有循环路径,否则将发生堆栈溢出
  3. 如果您想将其存储为单独的文档,则必须使用第二类(2)并进行多次插入。

    当对象存储为具有嵌套嵌入的大型文档时,实际上不可能跨多个级别进行查询。您可能想看一些替代方案,如:

    http://www.mongodb.org/display/DOCS/Trees+in+MongoDB

答案 1 :(得分:0)

是的,这完全有可能。

您必须了解MongoDB和大多数NoSQL解决方案的一件事是对象可以包含在其他对象中。对于MongoDB,基本上,如果你可以用JSON创建对象,那么你可以在MongoDB中创建对象。

通常,您应该努力拥有“相对”非规范化的数据库结构。只要您不经常更新数据,就可以获得一些重复数据。

答案 2 :(得分:0)

如果您真的想要引用其他文档,可以使用DBRef。但是,MongoDB中的引用存在限制。

  • 您只能通过参考
  • 上的ID进行查询
  • 当您收到Thing的文档时,您将不得不进行第二次查询以获取相关的RelatingThing文档,因为MongoDB中不存在连接。

答案 3 :(得分:0)

我最近遇到了同样的问题,我通常会远离他们,但是......我认为这对于在Id领域部署的重要编号系统来说是个很好用的。

class Thing {
string Id {get; set;}
string Name {get; set;}
string RelatedThing {get; set;}}

所以,简化,如果 Id 类似于“T00001”(或者确实是T + GUID),你可以轻松获取 一套东西查询类似 Id以T 开头的内容,并为它们设置所有对象(或者仅为您知道的子集包含您的引用,如果它是一个非常大的集合)。 / p>

你知道/期望 RelatedThing 成为 Thing ,但它从Mongo返回时只是一个字符串。但是如果你已经按照上面的方式设置了对象,你就可以有效地使用字符串,就好像它是一个对象引用一样(毕竟,它就是它的真实含义,完成了“手动”)。

这是一种“宽松”的做法,但对你来说可能是可行的。

任何人都可以看到这种方法有任何陷阱吗?