2013-02-17 1 views
3

다음 구조로 문서를 검색하는 가장 효과적인 방법이 필요합니다. UNION과 (VAR3으로 분류 VAR1으로 분류 N 기록, n은 VAR2으로 분류되어 기록, N 기록)에 내가이 세 가지의 조합이됩니다 필요없는 결과mongodb의 동일한 컬렉션에있는 유니온

는 SQL 방법으로

{ _id:"", 
var1: number, 
var2: number, 
var3: number, 
} 

나는 중복 기대 제거 할.

mongodb를 처음 사용하는 경우 해당 작업에 대한 쿼리를 작성하는 올바른 방법을 찾을 수 없다면 mongodb에서 가능해야한다고 생각합니다.

가능하지 않은 경우 대체 nosql 솔루션을 제안 해주십시오.

답변

5

$or 무엇 당신이 찾고있는 가장 가까운 MongoDB를 연산자,하지만 하나의 결과로 두 개의 쿼리를 결합하는 SQL UNION와 같지 않습니다. MongoDB 쿼리는 항상 단일 컬렉션에 대해 수행되지만 $or은 여러 쿼리 절을 가질 수 있습니다. 예를 들어

:

db.collection.find(
    // Find documents matching any of these values 
    {$or:[ 
     {var1: 123}, 
     {var2: 456}, 
     {var3: 789} 
    ]} 
).sort(
    // Sort in ascending order 
    {var1:1, var2:1, var3:1} 
) 

단일 수집을 쿼리로 제한되어 있기 때문에이 결과는 이미 문서 레벨에서 중복 제거되고 하나가 지정되면 모든 결과는 같은 정렬 순서를 공유합니다.

MongoDB에서 UNION (또는 여러 콜렉션/쿼리로 작업하는 다른 연산)을 시뮬레이트하려면 여러 쿼리를 작성하고 결과 세트를 응용 프로그램 코드에 병합해야합니다.

+0

문제는 정렬 및 제한입니다. 각 세트의 첫 번째 레코드 만 필요합니다. 어쨌든 나는 mongodb에서 가능한 많은 쿼리를 통해 그것을 할 것이라고 생각하지 않습니다. {var1 : -1, var2 : -1, var3 : -1}은 3 개의 값 모두를 고려하여 결과가 정렬된다는 것을 의미합니다. A = { "var1": 3, "var2": 8, "var3": 11} B = { "var1": 4, "var2": 6, "var3": 9} C = { "var1 (var3 = 11), B (var3 = 9), C (var2 = 7) 또는 C (var2 = 7), B (var2 = 7), B (var2 = 6), A (var1 = 3) –

+0

예 .. 각 쿼리에서 샘플링하려면 여러 쿼리를 수행하고 코드에서 결과를 병합해야합니다. 정렬 순서를 비교하는 가장 쉬운 방법은 쉘에서 예제를 시도하는 것입니다 :). "-1"필드를 사용하는 스펙은 해당 필드의 내림차순으로 정렬됩니다 (오름차순의 경우 1). – Stennie

관련 문제