Я пытаюсь добавить частичный индекс в столбец postgresql jsonb. Столбец jsonb называется: email_provider. Я попытался добавить частичный индекс в столбце, как показано ниже, но он вызывает различную ошибку, подобную этому PG :: UndefinedColumn: ERROR: столбец «email_povider» не существует, а в других случаях он вызывает ошибку: PG :: AmbiguousFunction : ОШИБКА: оператор не является уникальным: неизвестно -> неизвестноСоздать частичный индекс для поля postgresql jsonb
частичный индекс в рельсы-5 миграция выглядит следующим образом:
add_index :accounts, :name, name: "index_accounts_on_email_provider_kind", using: :gin, where: "('email_provider' -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com') AND ('email_povider' -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com')"
JSON для столбца email_provider выглядит следующим образом:
{
"email_provider": {
"sparkpost": {
"smtp_host": "www.sparkpost.com",
"smtp_port": ""
},
"aws ses": {
"smtp_host": "www.amazon/ses.com ",
"smtp_port": " ",
"username": " ",
"password": " "
}
}
}
таблица выглядит следующим образом:
class CreateAccounts < ActiveRecord::Migration[5.0]
def change
create_table :accounts do |t|
t.string :name, null: false
t.jsonb :email_provider, null: false
t.jsonb :social_account, default: '[]', null: false
t.timestamps
end
add_index :accounts, :name, name: "index_accounts_on_email_provider_kind", using: :gin, where: "('email_provider' -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com') AND ('email_povider' -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com')"
add_index :accounts, :name, name: "index_accounts_on_social_account_type", using: :gin, where: " 'social_account' @> [{'type': 'facebook'}] AND 'social_account' @> [{'type': 'twitter'}]"
end
end
Update
на основе незначительной корректировки принятого ответ ниже, код, я использую для создания ВТКЕГО не джина индекса в рельсах activerecord показано ниже. Это создает индекс ВТКЕЯ, потому что мы используем столбец имени, которое строковый типа данных и не jsonb, как описано here:
add_index :accounts, :name, name: "index_accounts_on_name_email_provider", where: "email_provider -> 'sparkpost' ->> 'smtp_host' = 'www.sparkpost.com' AND email_provider -> 'amazon ses' ->> 'smtp_host' = 'www.awses.com' "
add_index :accounts, :name, name: "index_accounts_on_name_social_account", where: " social_account @> '[{\"type\": \"facebook\"}]'::jsonb AND social_account @> '[{\"type\": \"twitter\"}]'::jsonb"
Спасибо, я попробую это и вернусь к вам. Но я скорее всего разместим индекс в столбце ** **, хотя столбец jsonb будет ** провайдером электронной почты **, потому что запрос будет быстрее, когда индекс находится в столбце ** ** и ** где запрос ** используется для ограничения нашего индекса на соответствие столбцу jsonb. Вы можете увидеть этот подход, объясненный здесь: http://blog.heapanalytics.com/speeding-up-postgresql-queries-with-partial-indexes/. – brg
Большое спасибо. Я сохранил индекс в столбце ** **. Единственное изменение заключалось в том, чтобы удалить **, используя:: gin **, поскольку индекс не находится непосредственно в столбце jsonb. Итак, окончательный код для одного из индексов выглядит так: ** add_index: accounts,: name, name: "index_accounts_on_name_email_provider", где: "(email_provider -> 'email_provider' -> 'sparkpost' - >> 'smtp_host' = ' www.sparkpost.com ') И (email_provider ->' email_povider '->' amazon ses '- >>' smtp_host '=' www.awses.com ') "**, который создает ** btree partial index ** в колонке ** name **, ограничивающей наши соответствия атрибутами в столбце jsonb. – brg