2016-08-21 109 views
1

JSONB嵌入式Ecto2模型我不是如何索引嵌入式結構爲JSONB與Ecto2/Postgres的9.4+索引Postgres裏9.4+

存儲我有使用embeds_one和embeds_many兩個嵌入式結構架構清晰。它們是ecto:在Postgres中以JSONB表示的地圖字段。我想知道如何確保他們被索引(使用杜松子?)進行快速查詢?我不知道這是否自動發生,如果我需要添加索引到我的遷移,或者如果我需要手動使用psql等。

只是尋求澄清這是如何工作的。 謝謝!

defmodule App.Repo.Migrations.CreateClient 
    def change do 
    create table(:clients) do 
     add :name, :string 
     add :settings, :map 
     add :roles, {:array, :map}, default: [] 
     timestamps() 
    end 

    // This works for normal schema/model fields 
    create index(:clients, [:name], unique: true, using: :gin) 

    // BUT CAN I INDEX MY EMBEDS HERE? 
    // GUESS: 
    create index(:clients, [:settings], using: :gin) 
    end 
end 

defmodule App.Client do 
    schema "client" do 
    field :name, :string 
    embeds_one :settings, Settings // single fixed schema "Settings" model 
    embeds_many :roles, Role  // array of "Role" models 
    end 
end 

defmodule Settings do 
    use Ecto.Model 
    embedded_schema do   // ALSO 
    field :name, :string  // are types relevant?   
    field :x_count, :integer // stored as strings (INDEXED?) 
    field :is_active, :boolean // deserialized via cast? 
    end 
end 

defmodule Role do 
    use Ecto.Model 
    embedded_schema do  
    field :token 
    field :display_english 
    field :display_spanish 
    end 
end 

回答

2

我想你只需要補充一點:

create index(:clients, [:name], unique: true, using: :gin) 

到遷移文件。

;如果索引SQL語句會很複雜,你可以用execute做,所以它會是這樣的:

execute("CREATE INDEX clients_name_index ON clients USING GIN (name)") 

我沒有測試過,但我相信它應該工作。

+0

對於客戶端模型中的頂級字段絕對是正確的,但我詢問索引JSONB:map字段 – errata

+0

嗯,去[here](https://www.postgresql.org/docs/current/static /datatype-json.html)並查看'jsonb Indexing'部分,jsonb列的語法與通常的相同,所以我的第一個示例應該工作,除非您爲索引添加了一些特定的選項,爲此'使用'執行' – JustMichael