Ecto查询Postgres JSON数组的值

时间:2017-05-02 14:40:31

标签: arrays json postgresql ecto

我有以下架构,它是一个post表的JSONB字段,它将保存所有使用的标签。

schema "posts" do
  ...
  field :tags, {:array, :string}
  ...
end

它有一个“标签”数组作为“字符串”。我想在这个数组中搜索一个字符串值。我试过了:

def search_by_tag(query, tag) do
  from p in query,
    where: fragment("? @> ?", p.tags, ^tag)
end

但是没有成功,我正在寻找的是一种搜索JSONB数组并在值存在时找到值的方法。此外,它应该保持查询的功能与非JSONB查询兼容,继续这样做:

Blog.Post |> Blog.Post.search_by_tag("tag1") |> Blog.User.active()

1 个答案:

答案 0 :(得分:1)

undefined 函数需要第二个operant是数组,所以:

@>

此外,ecto语法支持这种情况:

def search_by_tag(query, tag) do
  tags = [tag]
  from p in query,
    where: fragment("? @> ?", p.tags, ^tags)
end

对于可组合查询def search_by_tag(query, tag) do from p in query, where: tag in p.tags end ,您可以考虑使用"pipe-based syntax"