2014-01-19 72 views
0

我有一個Web表單,用戶可以在其中動態添加文本字段。然後,他可以在這些文本字段中輸入數據並提交表單,然後將表單保存到MongoDB中。使用LINQ來搜索MongoDB集合,它是動態構建的

然後我想從MongoDB中檢索一些數據。但我不知道如何做到這一點。

通常我會事先定義entity類。就像:

public class User 
{ 
    public string Name {get;set;} 
    public int Age {get;set;} 
} 

然後,我通常有一些存儲庫類,它能夠從MongoDB中檢索數據。

var userRepo = new Repository<User>(); 
var user = userRepo.Where(x => x.Name == "something"); 

但由於這些表單字段建立動態我沒有在編譯時爲它定義class的方式。

所以用我的回購類將不會在這種情況下工作:

var someRepo = new Repository<What_To_Put_Here?>(); 

這意味着我不能使用得心應手LINQ表達式,因爲MongoDB中收集並不代表我的代碼的任何類。

我不知道我的新模式應該如何通過MongoDB進行搜索,就像我使用我的Repository類一樣。我仍然喜歡以某種方式使用LINQ來搜索(動態構建)集合。

有沒有反正我可以解決這個問題?

+0

您可以使用泛型來更改通用「T」元素的「What_To_Put_here」。但我認爲你仍然會遇到同樣的問題,因爲你不知道你的存儲文檔中的字段是如何存在的。也許你可以使用LINQ投影來解析文檔到已知的類。 – rubenfa

回答

0

由於您不知道編譯時的類型及其屬性,所以不能使用LINQ。當然,你可以做一些瘋狂的事情來使用LINQ(反思想起來......),但這不會讓事情變得更好,只會更糟糕。如果數據模式在編譯時未知,那麼使用編譯時助手是沒有意義的。

改爲使用查詢構建器(using MongoDB.Driver.Builders)。是這樣的:

db.GetCollection("CollectionName").Find(Query.EQ("MyFieldName", value)); 

的好處是,它允許動態地構造查詢,不足之處是,它不是強類型的,所以你可能會意外地要求甚至不存在的字段,但問題是固有的動態類型。

使用鍵值對可能是一個好主意,而不是將用戶的模式映射到實際的mongodb模式,例如,使用{ "form" : "foo", "customValues" : [ { "key" : "domain", "value" : "acme.com"}, ... ] }而不是實際增加一個字段,如{ "form" : "foo", "domain" : "acme.com" },因爲後者不會將您的數據與他們分開,很容易發生衝突,很難進行數據遷移,並且無法進行索引。