DocumentDB Sub Query

Я пытаюсь проецировать из большого документа, содержащего двойной вложенный массив, в плоское представление массива, и я застрял на том, как продолжить.

У меня есть документы, похожие на это:

{
    "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"
          }
        }
      ]
    ]
  }

Я пытаюсь спроецировать его на следующую структуру:

{
    "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
        }
      ]
    ]
  }

Я добился определенного успеха, используя следующий запрос:

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

Но это неверно. Я ищу информацию о вложенных / вложенных выборках и возвращении данных путем детализации вложенных массивов.

 Larry Maccherone28 июн. 2016 г., 20:52
У меня есть главный узел в моей системе, который перезагружает все Sprocs и UDF каждый раз, когда он загружается. Я также могу вызвать что-то сделать, когда захочу. Но если вы действительно хотите избежать UDF, то я не знаю, как делать то, что вы просите. Кто-то еще может, хотя. Я видел, как некоторые мастера SQL ответили на эти вопросы.
 Tristan Rhodes28 июн. 2016 г., 17:53
Привет Ларри. Исправлен проектируемый документ. И да, вы правы в том, чего я хочу достичь. В настоящее время я стараюсь избегать UDF, поскольку у меня нет хорошей стратегии управления ими, поскольку я ожидаю, что это будет синхронизировано при запуске приложения, но приложения развернуты на большом количестве машин, поэтому я могу видеть это вызывает проблемы.
 Larry Maccherone28 июн. 2016 г., 17:06
Чтобы убедиться, что я понимаю вопрос, вы хотите оставитьconfigurationVariables поле из подэлементов и выровнять список компонентов, верно? Кроме того, в ожидаемом выводе есть ряд других полей, которые не отображаются в примере документа. Они уже на верхнем уровне? Ответ, который я собираюсь дать, - это UDF, который сделает «проекцию» за вас. Я подозреваю, что то, что вы предлагаете, может быть сделано в чистом SQL, но я обнаружил, что пользовательские функции JavaScript - гораздо более простой способ выполнить эти преобразования, чем использование SQL.

Ответы на вопрос(1)

Поддержка 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;
 }
 garfbradaz28 июн. 2018 г., 14:05
Привет, есть новости о поддержке Sub Query?
 Aravind Krishna R.29 июн. 2018 г., 05:13
Да, подзапрос доступен сейчас (пока еще не задокументирован!)
 garfbradaz29 июн. 2018 г., 08:33
Я написал по электронной почте askcosmosdb с проблемой Аравинд (stackoverflow.com/questions/51042600/...), что я думаю, что подзапрос мог бы решить (подзапрос для проекции).

Ваш ответ на вопрос