Couchbase Query для получения данных о вложенном уровне свойства и создания индекса - PullRequest
1 голос
/ 14 мая 2019

Как запросить вложенные значения документа в couchbase n1ql в java?

Значением документа является объект (Person) с 1 типом его свойства a Список объектов (адресов).

Объект адреса имеет несколько свойств, таких как city, zipCode и т. Д.

Как написать запрос для поиска подходящих записей на основе самого низкого уровня (например, city или zipCode)

Ниже приведен пример структуры документа, все документы имеют схожую структуру

{
    companyName: "ABC Inc",
    companyId: 123,
    persons: [
        {
          "name": "John Smith",
          "address": [
                {
                    "city": "London",
                    "zipCode": 1234,
                    "street": "23 Nottingham dr",
                    "contact": "123456678"
                },
                {
                    "city": "Los Angeles",
                    "zipCode": 67834,
                    "street": "345 Richmond dr",
                    "contact": "23456"
                }
            ]
        },
        {
          "name": "Peter Drink",
          "address": [
                {
                    "city": "Delhi",
                    "zipCode": 70046,
                    "street": "SP Road",
                    "contact": "9844334"
                },
                {
                    "city": "Los Angeles",
                    "zipCode": 67834,
                    "street": "433 Ku St",
                    "contact": "12345677"
                }
            ]
        }
    ]
}

критерий ввода - zipCode, мне нужно иметь возможность получать все объекты person во всех документах на основе zipCode

Ввод: zipCode 67834 Ожидаемый результат:

[
    {
        "city": "Los Angeles",
        "zipCode": 67834,
        "street": "433 Ku St",
        "contact": "12345677"
    },
    {
        "city": "Los Angeles",
        "zipCode": 67834,
        "street": "345 Richmond dr",
        "contact": "23456"
    }
]

1 Ответ

2 голосов
/ 15 мая 2019

Сначала необходимо UNNEST для массивов (это делает самостоятельное объединение родительского документа с каждым документом массива)

SELECT a.*
FROM default AS d
UNNEST d.persons AS p
UNNEST p.address AS a
WHERE a.zipCode = 67834 AND .....;


CREATE INDEX ix1 ON default(DISTINCT ARRAY (DISTINCT ARRAY a.zipCode FOR a IN p.address END) FOR p IN persons END);

Имена переменных привязки в индексе должны совпадать с именами псевдонимов Unnest, чтобы выбрать индекс.

...