2011-10-28 68 views
2

我遇到過將域模型的特定部分表示爲關係型的情況。我閱讀了MongoDB中的database references部分,並且理解您可以通過爲外部集合中的各種文檔提供$ ref引用的JSON數組來提供對多個文檔的引用。在MongoDB中使用MongoDBRef引用多個外部文檔

所有我見過的用於在代碼中添加對外文檔引用的示例都只針對單個文檔,並且它們已創建了MongoDBRef類型的公共屬性。在我看來,這種方法存在很多不必要的開銷,但是它也沒有明確說明如何存儲對多個文檔的引用。

如果您想在Mongo中提供外部文檔之間的一對多關係,是否需要提供包含MongoDBRef對象的集合屬性?是否可以堅持我的C#代碼中的標準實體對象的集合,並使用BsonClassMap將其映射到Mongo文檔?

下面是一個簡單的類,代表我現在擁有的模型。它似乎是正確保存文檔和引用,但我不喜歡公開的MongoDBRef對象集合以及爲使用Person類的任何人添加新文檔所需的開銷。

如果很重要,我使用MongoDB 2.0和他們的C#驅動程序。

// This is how my class currently looks 
public class Person 
{ 
    public string Name { get; set; } 
    public List<MongoDBRef> Vehicles { get; private set; } 

    public Person() 
    { 
     Vehicles = new List<MongoDBRef>(); 
    } 
} 

// This is what I want my class to look like 
public class Person 
{ 
    public string Name { get; set; } 
    public List<Vehicle> Vehicles { get; private set; } 

    public Person() 
    { 
     Vehicles = new List<Vehicle>(); 
    } 
} 

回答

3

DBRefs不適用於存儲對已知文檔類型的引用。相反,只需將集合中引用文檔的_id值保存即可。給定一個好的映射庫(不知道C#,但C#相當於pymongo,貓鼬,嗎啡等),它可以讓你做到你想要的。

只有在編譯時不知道需要存儲引用的文檔類型(例如,包含圖像或文本的「內容」字段等)時才應使用DBRefs。

+0

謝謝你的回覆。當你說C#等價物會讓我做我想做的事時,這個功能是否有名字?我已經閱讀了C#驅動程序上的文檔,但我沒有看到任何關於此的信息,所以我希望我只是忽略了一些東西。 – senfo

+1

它通常不是一個驅動程序功能,坦率地說,我不能在C3上加速。看起來它實際上與一些不同的驅動程序有點混淆,有些LINQ支持其他的並不是那麼多。如果你堅持使用C#,你可能需要手動完成,或者在github或google代碼上尋找一些早期的工作。 –

+1

爲什麼DBRefs在文檔類型已知時不適用? –