2016-06-28 5 views
1

이중 중첩 배열을 포함하는 큰 문서에서 배열의 병합 된 표현으로 프로젝트를 진행하려고합니다. 진행 방법이 고착되었습니다.DocumentDB Sub Query

: 나는 다음과 같은 쿼리를 사용하여 일부 성공을 거두었습니다

{ 
    "id": "275973", 
    "themeId": "e4d3549c-2785-4067-83d6-f396d2212776", 
    "enabled": false, 
    "archived": false, 
    "components": [ 
     { 
      "componentType": "header", 
      "enabled": true 
     }, 
     { 
      "componentType": "prompt", 
      "enabled": true, 
     }, 
     { 
      "componentType": "proactive", 
      "enabled": true, 
     }, 
     { 
      "componentType": "product-feed", 
      "enabled": true 
     } 
     ] 
    ] 
    } 

: 나는 다음과 같은 구조로 프로젝트에 노력하고

{ 
    "id": "1", 
    "themeId": "e4d3549c-2785-4067-83d6-f396d2212776", 
    "enabled": false, 
    "archived": false, 
    "componentGroups": [ 
     [ 
     { 
      "componentType": "header", 
      "enabled": true, 
      "configurationVariables": { 
      "text1": "AAA", 
      "text2": "BBB" 
      } 
     } 
     ], 
     [ 
     { 
      "componentType": "prompt", 
      "enabled": true, 
      "configurationVariables": { 
      "text1": "AAA", 
      "text2": "BBB" 
      } 
     }, 
     { 
      "componentType": "proactive", 
      "enabled": true, 
      "configurationVariables": { 
      "text1": "AAA", 
      "text2": "BBB" 
      } 
     } 
     ], 
     [ 
     { 
      "componentType": "product-feed", 
      "enabled": true, 
      "configurationVariables": { 
      "text1": "AAA", 
      "text2": "BBB" 
      } 
     } 
     ] 
    ] 
    } 

:

나는이 유사 문서가

SELECT T.id, 
    T.themeId, 
    T.enabled, 
    T.archived, 
    [ { type: C.componentType, enabled: C.enabled } ] AS components 
FROM Panels T 
JOIN CG IN T.componentGroups 
JOIN C IN CG 
WHERE T.id IN ("275973") 

그러나 각 구성 요소 유형에 대해 별도의 레코드가 반환됩니다. 모든 구성 요소가 포함 된 문서의 단일 인스턴스 내에 있도록 모든 요소를 ​​함께 묶으려고합니다. 나는이 비슷한 나 외부 문서에 가입 할 수 있습니다 중첩 된 SELECT와 같은 무언가를 할 수 있기를 기대했다 :

SELECT T.id, 
T.themeId, 
T.enabled, 
T.archived, 
[ 
    SELECT C.componentType, C.enabled 
    FROM CG IN T.componentGroups 
    JOIN C IN CG 
] AS components 
FROM Panels T 
WHERE T.id IN ("275973") 

하지만이 유효하지 않습니다. 중첩 배열로 드릴링하여 하위/중첩 선택 및 반환 데이터에 대한 정보를 찾고 있습니다.

+0

, 난 당신이 하위 요소에서'configurationVariables' 필드를 삭제하고 구성 요소 목록을 평평하게 할 질문을 이해를 잘 만들려면입니다 ? 또한 예상 출력에는 문서 예제에 나타나지 않는 여러 필드가 있습니다. 이미 최고 수준입니까? 내가 제공하려는 대답은 당신을 위해 "투영"을 할 UDF입니다. 나는 당신이 제안한 것이 순수한 SQL로 수행 될 수 있다고 생각하지만, JavaScript UDF는 SQL을 사용하는 것보다이 변환을 수행하는 훨씬 쉬운 방법이라는 것을 알았다. –

+0

안녕 Larry. 투영 된 문서를 수정했습니다. 그리고 네, 당신은 내가 성취하고자하는 바를 정확히 알고 있습니다. 저는 UDF를 피하려고 애 쓰고 있습니다. 앱을 시작할 때 동기화 될 것으로 예상했기 때문에 관리하기에 좋은 전략이 없으므로 앱이 많은 수의 컴퓨터에 배포되므로 볼 수 있습니다. 이것은 문제를 일으킨다. –

+0

부팅 할 때마다 모든 Sprocs 및 UDF를 다시로드하는 시스템에 마스터 노드가 있습니다. 나는 언제든지 그것을 할 수있는 어떤 것을 촉발시킬 수있다. 그러나 정말로 UDF를 피하려는 경우, 사용자가 묻는 것을 수행하는 방법을 모른다. 그러나 다른 누군가는 그렇게 할 수 있습니다. 일부 SQL 마스터가 이러한 질문에 대답하는 것을 보았습니다. –

답변

0

하위 쿼리에 대한 DocumentDB 지원이 계획되어 있지만 현재 지원되지 않습니다. 한편, UDF 또는 데이터 클라이언트 측을 N 레코드로 가져 와서 다시 포맷하면 오늘날이 작업을 수행하는 가장 좋은 방법입니다. 관심있는 사람들을위한, 여기에 쿼리의 결과를 반환하기위한 UDF,

function transform(doc) { 
    var result = {}; 

    for (var prop in doc) { 
     if (prop != "componentGroups") { 
      result[prop] = doc[prop]; 
     } else { 
      result["components"] = []; 
      for(var cgidx in doc["componentGroups"]) { 
       var componentGroup = doc["componentGroups"][cgidx]; 
       for (var cidx in componentGroup) { 
        var component = componentGroup[cidx]; 
        result["components"].push({componentType: component.componentType, enabled: component.enabled }); 
       } 
      } 
     } 
    } 

    return result; 
}