首页 文章

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

提问于
浏览
7

我正在研究MongoDB . 据我所知,官方C#驱动程序可以执行POCOs的序列化和反序列化 . 我在谈论的东西将被表示为两个单独的文档,带有ID链接,而不是嵌入的文档 .

Can the serialization mechanism handle this kind of situation? (1):

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

Or do we have to sacrifice some OOP, and do something like this? (2) :

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

UPDATE:

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

a) If the serializer is able to handle situation (1). What is an example of how to do this without using embedding?

b) If using embedding, would it be possible to query across all 'Things' regardless of whether they were 'parents' or embedded elements? How would such a query look like?

4 回答

  • 0

    如果您真的想要引用另一个文档,可以使用DBRef . 但是,MongoDB中的引用存在限制 .

    • 你只能通过ref在id上查询

    • 当你得到你的东西时's document, you'将不得不进行第二次查询以获得MongoDB中存在的相关RelatingThing 's document as join doesn't .

  • 0

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

    • 正如你猜测的那样,它将使用嵌入来表示这一点

    • 对象图中必须没有循环路径,否则将发生堆栈溢出

    如果要将其存储为单独的文档,则必须使用第二个类(2)并执行多个插入 .

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

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

  • 11

    是的,这是完全可能的 .

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

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

  • 0

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

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

    因此,简化,如果Id类似于"T00001"(或者实际上是T GUID),您可以通过查询像Id以T开头,并为它们设置所有对象(或仅用于子集)来轻松地从Mongo获取一组内容你知道包含你的参考,如果它是一个非常大的集合) .

    你知道/期望RelatedThing是一个东西,但它从Mongo回来时只是一个字符串 . 但是如果你像上面那样设置对象,你可以有效地使用字符串,就像它是一个对象引用一样(毕竟,它就是它的真实含义,完成了某种"manually") .

    它是一种“松散”的方式,但对你来说可能是可行的 .

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

相关问题