2013-03-19 4 views
0

내가 RavenDB에 새로 온 사람과 나는 까마귀 DB 문서가 있습니다RavenDB : 아동 수집 교차로

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

내가 ID 1과 학생의 과목의 교차점을 얻을 수있는 쿼리를 작성하기 위해 노력하고있어 및 학생 2 ID :

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

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

이들 교차점은 {22,25}가 될 것입니다.이 경우 교차 교과 대상 개수 2가 필요합니다.

이 유형의 검색어에 접근하는 가장 좋은 방법은 무엇입니까? 이러한 종류의 쿼리를 더 잘 처리하는 다른 NoSQL 솔루션이 있습니까? 또한, 나는 학생 컬렉션을 메모리에 저장하려고합니다.

샤딩을 지원하는 db가 필요하며 1500 만 개의 문서 세트 (레이븐 또는 몽고와 같은 db 솔루션을 사용하여 여러 컴퓨터에서 공유 할 수 있음)가 있습니다. DB 수준에서이 작업을 수행해야하며 RavenDB 설명서에서 db 수준에서이 작업을 수행하는 방법을 찾을 수 없습니다. 다음과 같은 쿼리를 수행 할 수 있습니다 (원래의 질문이 아니었다) 귀하의 의견을 바탕으로

+0

무엇을 시도 했습니까? 약간의 코드를 게시하십시오. 또한 데이터베이스에서 수행되는 것이 중요한 이유는 무엇입니까? 당신은 간단하게 두 학생을 검색하고 자신을 교차로 할 수 있습니다. db 솔루션이 필요한 이유를 설명하지 않았습니다. 이러한 결과에 어떤 방식으로 합치고 있습니까? 방법? –

+0

@MattJohnson 샤딩을위한 db 솔루션이 필요하며 1500 만 개의 문서 세트 (까마귀 또는 몽고와 같은 db 솔루션을 사용하여 여러 시스템에 분산시킬 수 있음)가 있습니다. 그래서 db 수준에서이 작업을 수행해야합니다. ravendb 문서에서 db 수준에서이 작업을 수행하는 방법을 찾지 못했습니다. –

+1

물론, 1,500 만 개의 문서를 저장해야 할 수도 있습니다. 1,500 만 건의 문서 교차로를 쿼리하고 싶습니까? 귀하의 예제는 2를 가져오고 있다고 말합니다. 이것이 전형적인 경우, 클라이언트 측 linq (예 : –

답변

1

:

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

등가 루씬 쿼리는 다음과 같습니다

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 } } 

3과 4에 모두 값이 없기 때문에 학생 1과 2 만 반환됩니다.

Intersection Queries에 대한 자세한 내용은 설명서를 참조하십시오.

+0

Matt는 답장을 보내 주셔서 감사합니다. 다시 1500 만 명의 응답자가 3 대의 컴퓨터에 분산되어있는 경우 3 대의 컴퓨터에서 병렬로 쿼리가 실행됩니까? 또는 데이터를 한 곳으로 집계 한 다음 쿼리를 실행합니까? –

+0

병렬로 실행되고 결과가 병합 병합 전략을 사용하여 병합됩니다. http://ravendb.net/docs/server/scaling-out/sharding –

+0

매트 감사합니다. –