使用 Ecto 查询对 jsonb 列中的字段求和

Sum a field in a jsonb column with an Ecto query

假设我在 Postgres 数据库中有一个 jsonb 类型的列,名为 info。其中一个字段是字节,它作为一个整数存储在信息字段中。

如果我尝试对 Ecto 查询中 info => bytes 字段的值求和,如下所示:

total_bytes = Repo.one(from job in FilesTable,
  select: sum(fragment("info->>'bytes'")))

我收到错误消息函数总和(文本)不存在

有没有一种方法可以编写上面的查询,以便 info => bytes 可以求和,或者我是否只需要 select 每行中的那个字段在数据库中,然后使用 Elixir 将值相加?

错误消息说它不能 sum 文本字段。您需要将该字段显式转换为整数,以便 sum 有效。

此外,在 fragment 中硬编码列名是不正确的。它仅在这种情况下有效,因为您只从一个 table 中进行选择。如果您在其中有一些连接语句与其他 table 具有相同的列名,则查询将不起作用。您可以在字符串中使用 ?,然后将该列作为参数传递。

这是最后应该起作用的东西:

sum(fragment("(?->>'bytes')::integer", job.info)))