2013-03-19 51 views
0

我是新來RavenDB和我有一個烏鴉的DB文件:RavenDB:兒童收集交叉口

Student 
{ 
    Id : int 
    Subjects : List<int> 
} 

我想編寫一個查詢來獲得學生的學科的交叉點與ID爲1,學生ID爲2

{ 
    ID : 1 
    Subjects : {22, 23, 25} 
} 

{ 
    ID : 2 
    Subjects : {22, 25 } 
} 

這些將是交集{} 22,25我還需要交集科目2在這種情況下的計數。

解決此類查詢的最佳方法是什麼?還有其他的NoSQL解決方案能更好地處理這種查詢嗎?另外,我試圖將學生集合緩存在內存中。

我需要一個支持分片的數據庫,並且我還有一個包含1500萬個文檔的數據集(我可以使用像Raven或Mongo這樣的db解決方案將它們分散到不同的機器上)。我必須在db級別執行此操作,並且我無法在RavenDB文檔中的db級別上找到任何操作。

+0

你有什麼試過?請張貼一些代碼。另外 - 爲什麼它在數據庫中完成呢?你可以簡單地找回兩個學生,並自己做交點。你還沒有解釋爲什麼你需要一個數據庫解決方案。你是以某種方式彙總這些結果嗎?怎麼樣? – 2013-03-19 21:32:35

+0

@MattJohnson我需要用於分片的數據庫解決方案,並且我擁有一個包含1500萬個文檔的數據集(我可以使用db解決方案像raven或mongo一樣將它們分散到不同的機器上)。所以,必須在db級別執行此操作。我找不到在ravendb文檔中如何在db級別執行此操作。 – 2013-03-19 22:06:39

+1

當然,您可能需要存儲1500萬個文檔。你是否想要查詢1500萬個文檔的交集?你的例子說你正在檢索2.如果這是典型的,你應該只加載這兩個文檔,並在客戶端linq(例如)自己做十字路口 – 2013-03-19 22:41:03

回答

1

根據您的意見(這是不是你原來的問題),您可以執行以下查詢:

var q = session.Query<Student>() 
       .Where(x => x.Subjects.Any(y => y == 22)) 
       .Intersect() 
       .Where(x => x.Subjects.Any(y => y == 25)); 

等效Lucene的查詢是:

Subjects:22 INTERSECT Subjects:25 

鑑於這樣的數據:

Student { Id = 1, Subjects = new List<int> { 22, 23, 25 } } 
Student { Id = 2, Subjects = new List<int> { 22, 25 } } 
Student { Id = 3, Subjects = new List<int> { 23, 25} } 
Student { Id = 4, Subjects = new List<int> { 22 } } 

只有學生1和2會被退回,因爲3和4沒有這兩個值。

您可以在文檔中閱讀有關Intersection Queries的更多信息。

+0

Matt謝謝你的答覆。同樣,如果1500萬受訪者分佈在3臺機器上3臺機器上的查詢是否並行執行?還是數據聚合到一個地方,然後查詢被執行? – 2013-03-20 03:45:38

+0

它們並行運行,並使用分片合併策略合併結果。見http://ravendb.net/docs/server/scaling-out/sharding – 2013-03-20 04:13:25

+0

非常感謝馬特。 – 2013-03-20 04:40:31