2015-12-02 29 views
8

Potrzebuję przeszukać wartości klucza tablicy pola jsonb w Postgresie.dodaj indeks do pola jsonb

field: {'array_key' : [1, 2, 3, 4]} 

Czy jest możliwe aby dodać indeks na array_key czy jest jakiś zoptymalizowany sposób przeszukiwać wartości?

wyszukiwania kwerenda będzie coś

select * where field['array_key'].include?(2) 
+0

puszka możesz dodać, jak będzie wyglądać twoje zapytanie? – ben

+0

na pewno .. coś jak, wybierz * gdzie pole ['array_key']. Zawiera? (2) – mudasir

Odpowiedz

10

Można utworzyć indeks kluczy jsonb jak

add_index :table_name, :field, :using => :gin, :expression => "(field->'array_key')", :name => 'index_table_name_on_field_array_keys' 

Następnie można przeszukiwać indeksowanych klucze jak

where("table_name.field->'array_keys' @> ?", Array(2)) 
+1

Jaka wersja szyny to wymaga? Używam wersji 4.2.1 i otrzymuję: 'Wystąpił błąd, anulowano tę i wszystkie późniejsze migracje: Nieznany klucz:: wyrażenie' – ChristopherJ

+0

Ah, widzę, że jest to nowe dla szyn 5. http: //guides.rubyonrails .org/5_0_release_notes.html # active-record-notable-changes – ChristopherJ

+2

'add_index: table_name," (field -> 'array_key') ", używając:: gin, name: 'index_table_name_on_field_array_keys'' w Rails 5.0.0 – Dinatih