2011-09-11 41 views
2

我正在編寫一個應用程序,用戶可以在其中寫入json代碼並將該json代碼存儲爲一個Id和一個集合。換句話說,它們指定一個Id,一個Collection(字符串; [a-zA-Z0-9])和一個Data(json,可以是任何有效的json)。RavenDb存儲和檢索無類對象(json)

直到現在我一直在使用RavenDb,因爲我認爲文檔數據庫是完美的,但是我在查詢時遇到了一些問題。

一個需要被存儲和查詢的目的之一是如下:

{ 
    "network": "some_network", 
    "names": ["name1","name2"], 
    "data": {"values":[],"keys":[]} 
} 

此目的應存儲與一些的ID或者指定,或者自動生成的(如果null給出),和一個集合(必須始終指定),然後我需要能夠根據集合,網絡和單個名稱來查詢它。例如,我有代碼query('users', '{"network":"some_network","names":"name1"}'),我需要該代碼來返回此對象(以及任何與之匹配的其他對象)。另外,我可以更改數據庫,但是數據庫需要能夠運行進程內(自託管),並且能夠在沒有安裝的情況下在沒有管理權限的情況下運行(換句話說,無法像wcf那樣綁定到主機名/ IP)。

我該如何做到這樣?

+0

你基本上運行此查詢:session.Query ()。凡(X => x.network == 「some_network」 && x.names.Any (y => y ==「name1」))。我不確定你在做什麼,但是如果你使用RavenDB附帶的工具,你應該沒問題。 – synhershko

+0

是的,但問題是我在編譯時不知道對象圖。如前所述,用戶可以製作json,但無論用戶喜歡,都可以製作。 – Alxandr

+0

和誰生成查詢?如果再次是用戶,請讓他使用Linq。 RavenDB將在索引方面做其餘的工作。 – synhershko

回答

4

我發現這個問題的答案:

public string Query(string dynIndexName, string query) 
    { 
     using (var session = store.OpenSession()) 
     { 
      var q = new IndexQuery(); 
      q.Query = query; 
      var result = session.Advanced.DatabaseCommands.Query("dynamic/" + dynIndexName, q, new string[0]); 
      return "[" + String.Join(",", result.Results.Select(r => r.ToString())) + "]"; 
     } 
    } 

調用查詢的方法之前,我轉換JSON查詢對象到Lucene的查詢,看起來像這樣:(network:"some_network" AND names:"name1"),並使用它作爲一個查詢 - 數據庫參數。用於存儲和檢索全班可以在這裏找到:https://github.com/Alxandr/RunJS/blob/master/src/AddIns/Storage/StorageMbro.cs