我正在研究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)如果使用嵌入,是否可以查询所有“事物”,无论它们是“父母”还是嵌入元素?这样的查询怎么样?
答案 0 :(得分:11)
C#驱动程序可以处理序列化包含对其自身另一个实例的引用的类(1)。但是:
如果您想将其存储为单独的文档,则必须使用第二类(2)并进行多次插入。
当对象存储为具有嵌套嵌入的大型文档时,实际上不可能跨多个级别进行查询。您可能想看一些替代方案,如:
答案 1 :(得分:0)
是的,这完全有可能。
您必须了解MongoDB和大多数NoSQL解决方案的一件事是对象可以包含在其他对象中。对于MongoDB,基本上,如果你可以用JSON创建对象,那么你可以在MongoDB中创建对象。
通常,您应该努力拥有“相对”非规范化的数据库结构。只要您不经常更新数据,就可以获得一些重复数据。
答案 2 :(得分:0)
如果您真的想要引用其他文档,可以使用DBRef。但是,MongoDB中的引用存在限制。
答案 3 :(得分:0)
我最近遇到了同样的问题,我通常会远离他们,但是......我认为这对于在Id领域部署的重要编号系统来说是个很好用的。
class Thing {
string Id {get; set;}
string Name {get; set;}
string RelatedThing {get; set;}}
所以,简化,如果 Id 类似于“T00001”(或者确实是T + GUID),你可以轻松获取 一套东西来自Mongo的em>查询类似 Id以T 开头的内容,并为它们设置所有对象(或者仅为您知道的子集包含您的引用,如果它是一个非常大的集合)。 / p>
你知道/期望 RelatedThing 成为 Thing ,但它从Mongo返回时只是一个字符串。但是如果你已经按照上面的方式设置了对象,你就可以有效地使用字符串,就好像它是一个对象引用一样(毕竟,它就是它的真实含义,完成了“手动”)。 这是一种“宽松”的做法,但对你来说可能是可行的。 任何人都可以看到这种方法有任何陷阱吗?