2016-06-28 11 views
1

ダブルネストされた配列を含む大きなドキュメントから、配列のフラット化された表現に投影しようとしています。DocumentDB Subクエリ

:私は次のクエリを使用して、いくつかの成功を収めてきた

{ 
    "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") 

ただし、これはコンポーネントタイプごとに別々のレコードを返します。私はすべてのコンポーネントが含まれているドキュメントの1つのインスタンス内に収まるようにそれらをすべて一緒に折りたたんでしようとしています。

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") 

しかし、これは無効です:私は、私はこれに似外の文書、で参加することができますネストされたSELECTような何かを行うことができるように期待していました。私はサブ/ネストされた選択とネストされた配列にドリルでデータを返すことについての情報を探しています。

+0

をクエリで結果を返すためだ、あなたは右、サブ要素から 'configurationVariables'フィールドをドロップし、コンポーネントのリストを平らにしたいです?また、ドキュメントの例には表示されない、期待される出力には他にもいくつかのフィールドがあります。それらはすでにトップレベルにありますか?私が提供しようとしている答えはあなたのために "投影"を行うUDFです。あなたが示唆しているのは純粋なSQLで行うことができますが、JavaScript UDFはSQLを使用するよりもはるかに簡単にこれらの変換を行うことができます。 –

+0

こんにちはラリー。投影された文書を修正しました。そして、はい、あなたは私が達成しようとしているものが正しいです。私は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; 
} 
関連する問題