Couchbase Index и N1QL Query - PullRequest
       20

Couchbase Index и N1QL Query

0 голосов
/ 27 мая 2018

Я создал новый контейнер FooBar на своем сервере couchbase.

У меня есть документ Json, представляющий собой список с некоторыми свойствами, который находится в моем баке couchbase следующим образом:

[
{
"Venue": "Venue1",
"Country": "AU",
"Locale": "QLD"
},
{
"Venue": "Venue2",
"Country": "AU",
"Locale": "NSW"
  },

  {
    "Venue": "Venue3",
    "Country": "AU",
    "Locale": "NSW"
}
]

Как получить запрос couchbase, чтобы он возвращал список местоположений при использовании запроса N1QL.

Например, SELECT * FROM FooBar WHERE Locale = 'QLD'

Пожалуйста, дайте мне знатьлюбых индексов, которые мне нужно было бы также создать.Кроме того, как я могу вернуть только результаты, если объект имеет тип Location, а не сказать другой объект, который может иметь свойство 'Locale'.

Chud

PS - Я также создал несколькоИндексы, однако я хотел бы непредвзятый ответ о том, как этого добиться.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Обычно вы сохраняете их как отдельные документы, а не как отдельный документ как массив объектов, как данные отображаются в настоящее время.

Поскольку вы можете смешивать структуры документов, обычный шаблон дляразличать их значит иметь что-то вроде поля типа.('type' ни в коем случае не является особенным, просто наиболее распространенный выбор.)

Итак, ваш пример будет выглядеть так:

{
  "Venue": "Venue1",
  "Country": "AU",
  "Locale": "QLD",
  "type": "location"
}
...
{
  "Venue": "Venue3",
  "Country": "AU",
  "Locale": "NSW",
  "type": "location"
}

, где каждый объект JSON будет отдельным документом суникальный идентификатор документа.(Если у вас есть некоторые предварительно определенные данные, которые вы хотите загрузить, посмотрите на cbimport, как добавить их в вашу базу данных. Есть несколько различных форматов для этого. Вы также можете сгенерировать идентификаторы документов для вас.)

Тогда то, что написал @vsr, правильно.Вы бы создали индекс в поле Locale.Это будет оптимальным для запроса, который вы хотите.Обратите внимание, что вы также можете создать индекс для каждого документа с CREATE INDEX ix1 ON FooBar(Locale);.В этом простом случае это не имеет значения.Прочитайте о функции объяснения запроса в консоли администратора, чтобы узнать, как ее использовать для оптимизации запросов.

Наконец, запрос @vsr также корректен:

SELECT * FROM FooBar WHERE type = "Location" AND Locale = "QLD";
0 голосов
/ 29 мая 2018

CREATE INDEX ix1 ON FooBar (Locale);

https://dzone.com/articles/designing-index-for-query-in-couchbase-n1ql

CREATE INDEX ix1 ON  FooBar(Locale) WHERE type = "Location";
SELECT * FROM FooBar WHERE type = "Location" AND Locale = "QLD";

Если это массив и имя файла - список

CREATE INDEX ix1 ON  FooBar(DISTINCT ARRAY v.Locale FOR v IN list END) WHERE type = "Location";
SELECT * FROM FooBar WHERE type = "Location" AND ANY v IN list SATISFIES v.Locale = "QLD" END;
...