N1QL - запрос многоуровневых вложенных данных JSON в CouchBase

Как выбрать весь документ JSON, запросив многоуровневые вложенные значения? Вот пример моего JSON:

{
  "id": "6316194187233559482",
  "type": "Hotel",
  "attributes": [
    {
      "country": "Germany",
      "officialNames": [
          {
            "name": "The Ritz-Carlton, Berlin",
            "language": "GER"
          }
      ],
      "streetsAndCities": [
          {
              "city": "Berlin",
              "cityLanguage": "GER",
              "street": "Potsdamer Platz ",
              "streetLanguage": "GER"
          }
      ]   
    }
  ]
}

И я хочу запросить у него атрибут «имя». Я экспериментировал с функцией UNNEST, и у меня нет проблем с доступом к первому уровню вложенных данных, то есть «officialNames». Но я не знаю, как получить доступ к атрибуту «имя». Обращение к нему по позиции, например:

SELECT * FROM document 
UNNEST attributes as attributes
WHERE attributes[0].officialNames[0].name = "The Ritz-Carlton, Berlin"

Не собирается работать, так как положение каждого атрибута в JSON может измениться.


person zwornik    schedule 05.12.2018    source источник
comment
Может вам помочь global-secondary-indexes?   -  person juanlumn    schedule 05.12.2018


Ответы (1)


Что вы имеете в виду, говоря «положение каждого атрибута в JSON может меняться»? Вы имеете в виду, что массивы "attributes", "officialNames" и "streetAndCities" могут иметь дополнительные записи, и вы хотите выполнить поиск по всем записям?

Если да, то взгляните на ЛЮБОЙ оператор здесь: https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/collectionops.html

person Johan Larson    schedule 05.12.2018
comment
Положение каждого атрибута в JSON может меняться, я имел в виду, что у officialNames есть массив объектов, в котором имя не всегда находится на позиции [0]. Мои данные JSON могут быть очень сложными / вложенными, поэтому я не думаю, что ссылка по позиции сработает. - person zwornik; 05.12.2018
comment
Хорошо, я думаю, вам следует несколько пересмотреть свою модель данных. Используйте массивы (с []) только для повторяющихся элементов, а карты (с {}) - для коллекций элементов. У вас есть контроль над порядком в массивах; у вас нет контроля над порядком на картах. В этой статье рассматривается моделирование JSON: blog.couchbase.com/json-data-modeling -rdbms-users - person Johan Larson; 05.12.2018
comment
В любом случае, если вы хотите сослаться на стоимость The Ritz-Carlton, Berlin, вы можете сделать это как attributes[0].officialNames[0].name - person Johan Larson; 05.12.2018
comment
По поводу пересмотра модели данных. У меня нет возможности изменить это. Я всего лишь конечный пользователь данных, что означает, что я могу только запрашивать их. - person zwornik; 06.12.2018