2011-06-21 127 views
2

我有一個管理C#設置的應用程序。所以我有一個文件,它看起來像:有關文檔和子文檔的mongodb的體系結構

{ 
    ApplicationName: "FooApplication", 
    Settings : [ 
      ConnectionString: "[email protected]", 
      UserName: "Admin" 
      Password: "Password" 
     ] 
    } 
} 
{ 
    ApplicationName: "BarApplication", 
    Settings : [ 
      ConnectionString: "[email protected]", 
      UserName: "Admin", 
      Password: "Password", 
      Special: "aaaaaaaaaaaaaa" 
     ] 
    } 
} 

正如你可以看到我的兩個應用FooApplication和BarApplication使用相同的設置,除了我的BarApplication多了一個設置,這是特殊的:「AAAAAAA」。

當天,我的ConnectionString成爲[email protected],它是更新每個應用程序文檔的ConnectionString字段的好方法嗎?其實我不知道我的情況是什麼,因爲我是使用MongoDB等NoSQL解決方案的新手。第二件事,我想插入一個新的應用程序,我想總是插入一些設置,如ConnectionString,UserName和Password,因爲它對每個應用程序都是一樣的,但是我在哪裏可以獲得這個通用設置?有一個名爲GlobalSettings的新集合,用於存儲常用設置?或者例如,我是否選擇applicationName FooApplication,獲取其公共字段的值,然後將其複製到我想要創建的新應用程序SuperApplication中?

任何意見將不勝感激。

謝謝你們。

+0

爲什麼你保存在同一文件中的所有連接? –

+0

因爲查詢我的應用程序文檔列表及其設置並將其顯示在我的樹視圖中會更容易。如果我有兩個集合,我不得不在Application集合和Setting集合之間使用某種連接。 – Gui

+0

我說過「同一文件」,而不是「同一個文件集」。 –

回答

1

首先,大多數NoSql商店的最佳實踐與RDBMS商店的最佳實踐類似。

其次,讓我們澄清術語。

  • 集合就是它聽起來像 - 一個文件集合。它類似於一張桌子。
  • 文檔本質上是集合中的記錄。

你最想要的是一組設置文件的集合,而不是包含所有設置的單個文檔。

你應該創建一個包含屬性

public class ApplicationSettings { 
    public ObjectId Id {get; set;} 
    public string Name {get; set;} 
    public Dictionary<string, string> Settings {get; set;} 
} 

現在你可以創建一個可以插入到集合中的ApplicationSettings實例的POCO。

您可以通過id(默認情況下,mongo已經有一個索引)或應用程序名稱進行查詢。

當您想要進行更新時,您可以通過按ID或名稱查詢來更新單個文檔,或者您可以一次更新所有文檔。

假設你使用的是官方的C#的驅動程序,它會是這個樣子:

更新單個文檔

var query = Query.EQ("_id", someIdHere); 
var update = Update.Set("Settings.ConnectionString", "[email protected]") 
collection.Update(query, update) 

(你從哪兒得到您的collection實例是由你。)

退房文檔的詳細信息:http://www.mongodb.org/display/DOCS/CSharp+Language+Center

+0

非常感謝你的回答。 – Gui