MySQL извлекает несколько вложенных значений из сохраненного документа json как одно значение - PullRequest
0 голосов
/ 15 мая 2018

Моя конечная цель - создать оператор выбора JSON_OBJECT(), который собирает только пару значений из сохраненного значения json.

Моя текущая итерация оператора select:

SELECT
  JSON_OBJECT(
      'id', document->>'$.id',
      'slug', document->>'$.slug',
      'title', document->>'$.title',
      'date_published', document->>'$.date_published',
      'toc', (SELECT JSON_OBJECT('title', document->>'$.toc[*][*].title') WHERE document->>'$.id' = document->>'$.id' )
  ) as document
FROM documents
WHERE 
  `type` = "item" AND
  NOW() > date_published;

где пример item документа может быть:

{
  "id": "d434089d-33ac-11e8-af1c-005056a40c60",
  "toc": [
    [
      {
        "id": "d4e1e442-57a9-11e8-af1c-005056a40c60",
        "slug": "0-intro",
        "chunk": 0,
        "index": 0,
        "pages": [],
        "title": "Intro",
        "urlsuffix": ""
      },
      {
        "id": "d4e1ef07-57a9-11e8-af1c-005056a40c60",
        "slug": "1-beginning",
        "chunk": 0,
        "index": 1,
        "pages": [
          {
            "id": "d4e1f726-57a9-11e8-af1c-005056a40c60",
            "slug": "2-nested-example",
            "chunk": 0,
            "index": 2,
            "pages": [],
            "title": "Nested Example",
            "urlsuffix": ""
          },
          {
            "id": "d4e1fee4-57a9-11e8-af1c-005056a40c60",
            "slug": "3-three-layers-deep",
            "chunk": 0,
            "index": 3,
            "pages": [
              {
                "id": "d4e2065e-57a9-11e8-af1c-005056a40c60",
                "slug": "4-four-in",
                "chunk": 0,
                "index": 4,
                "pages": [],
                "title": "Four In",
                "urlsuffix": ""
              },
              {
                "id": "d4e20e47-57a9-11e8-af1c-005056a40c60",
                "slug": "5-maximum-nesting",
                "chunk": 0,
                "index": 5,
                "pages": [],
                "title": "This is likely the maximum amount of Nesting",
                "urlsuffix": ""
              }
            ],
            "title": "Three Layers Deep",
            "urlsuffix": ""
          },
          {
            "id": "d4e2168b-57a9-11e8-af1c-005056a40c60",
            "slug": "6-follow-up-chapter",
            "chunk": 0,
            "index": 6,
            "pages": [],
            "title": "Follow-up Chapter",
            "urlsuffix": ""
          }
        ],
        "title": "The Beginning",
        "urlsuffix": ""
      }
    ]
  ],
  "slug": "an-item",
  "tags": [
    "test-item"
  ],
  "type": "item",
  "title": "An Item",
  "download": null,
  "date_added": "1522342602",
  "page_count": null,
  "description": "",
  "date_published": "1522238400"
}

И это то, что я пытаюсь выполнить в результате записи результата оператора select (для примера документа):

{
  "id": "d434089d-33ac-11e8-af1c-005056a40c60",
  "slug": "an-item",
  "title": "An Item",
  "date_published": "1522238400",
  "toc": [
    {
      "id": "d4e1e442-57a9-11e8-af1c-005056a40c60",
      "slug": "0-intro",
      "title": "Intro",
      "urlsuffix": ""
    },
    {
      "id": "d4e1ef07-57a9-11e8-af1c-005056a40c60",
      "slug": "1-beginning",
      "title": "The Beginning",
      "urlsuffix": ""
    }
  ]
}

Так что, по сути, просто массив элементов оглавления верхнего уровня (глубина [1])

Я позволю выполнить логику в приложении, если я абсолютно в этом нуждаюсь, я просто чувствую, что должен быть способ сделать это, используя функции MySQL json.

Есть ли способ запросить максимальную глубину при выборе объекта / массива?

Я работаю с 5.7.22, поэтому у меня есть последние модные функции JSON (JSON_ARRAYAGG / JSON_OBJECTAGG и т. Д.)

...