标签: jsonb

PostgreSQL引入的JSONB解释

PostgreSQL刚刚推出了JSONB,它已经在黑客新闻上发展趋势.如果有人能够解释它与之前在PostgreSQL中出现的Hstore和JSON有何不同,那就太好了.它的优点和局限是什么?何时有人考虑使用它?

postgresql json nosql postgresql-json jsonb

304
推荐指数
9
解决办法
11万
查看次数

如何在Postgres 9.4中对JSONB类型的列执行更新操作

查看Postgres 9.4数据类型JSONB的文档,对我来说如何对JSONB列进行更新并不是很明显.

JSONB类型和函数的文档:

http://www.postgresql.org/docs/9.4/static/functions-json.html http://www.postgresql.org/docs/9.4/static/datatype-json.html

作为示例,我有这个基本的表结构:

CREATE TABLE test(id serial, data jsonb);
Run Code Online (Sandbox Code Playgroud)

插入很简单,如:

INSERT INTO test(data) values ('{"name": "my-name", "tags": ["tag1", "tag2"]}');
Run Code Online (Sandbox Code Playgroud)

现在,我将如何更新"数据"列?这是无效的语法:

UPDATE test SET data->'name' = 'my-other-name' WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

这个文件记录在哪里,我错过了吗?谢谢.

postgresql crud sql-update jsonb postgresql-9.4

110
推荐指数
8
解决办法
12万
查看次数

查询JSON类型中的数组元素

我正在尝试测试jsonPostgreSQL 9.3中的类型.
我在一个json名为data的表中调用了一列reports.JSON看起来像这样:

{
  "objects": [
    {"src":"foo.png"},
    {"src":"bar.png"}
  ],
  "background":"background.png"
}
Run Code Online (Sandbox Code Playgroud)

我想查询表中所有与'objects'数组中'src'值匹配的报告.例如,是否可以在数据库中查询匹配的所有报告'src' = 'foo.png'?我成功写了一个可以匹配的查询"background":

SELECT data AS data FROM reports where data->>'background' = 'background.png'
Run Code Online (Sandbox Code Playgroud)

但由于"objects"有一系列的价值观,我似乎无法写出有用的东西.是否可以在数据库中查询匹配的所有报告'src' = 'foo.png'?我查看了这些来源,但仍然无法得到它:

我也尝试过这样的事情,但无济于事:

SELECT json_array_elements(data->'objects') AS data from reports
WHERE  data->>'src' = 'foo.png';
Run Code Online (Sandbox Code Playgroud)

我不是SQL专家,所以我不知道我做错了什么.

sql postgresql json lateral jsonb

96
推荐指数
2
解决办法
12万
查看次数

用于在JSON数组中查找元素的索引

我有一个看起来像这样的表:

CREATE TABLE tracks (id SERIAL, artists JSON);

INSERT INTO tracks (id, artists) 
  VALUES (1, '[{"name": "blink-182"}]');

INSERT INTO tracks (id, artists) 
  VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)

还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.

我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.

我正在使用此查询:

SELECT * FROM tracks 
  WHERE 'ARTIST NAME' IN
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

例如

SELECT * FROM tracks
  WHERE 'The Dirty Heads' IN 
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.

sql postgresql indexing json jsonb

74
推荐指数
1
解决办法
5万
查看次数

如何在json列中查询空对象?

想要查找某个json列包含空对象的所有行,{}.这可以使用JSON数组,或者如果我在对象中查找特定键.但我只是想知道对象是否为空.似乎找不到会这样做的运营商.

 dev=# \d test
     Table "public.test"
  Column | Type | Modifiers
 --------+------+-----------
  foo    | json |

 dev=# select * from test;
    foo
 ---------
  {"a":1}
  {"b":1}
  {}
 (3 rows)

 dev=# select * from test where foo != '{}';
 ERROR:  operator does not exist: json <> unknown
 LINE 1: select * from test where foo != '{}';
                                      ^
 HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
 dev=# select * from …
Run Code Online (Sandbox Code Playgroud)

postgresql json types jsonb

55
推荐指数
4
解决办法
4万
查看次数

postgresql将JSON迁移到JSONB

在postgresql 9.4中,新的JSONB被合并.

在postgresql 9.3中的实时数据库中,我有一个JSON列.

我想将其迁移到JSONB.

假设我首先将数据库迁移到9.4(使用pg_upgrade).接下来我该怎么办?

postgresql jsonb

47
推荐指数
2
解决办法
2万
查看次数

在查询中合并连接JSON(B)列

使用Postgres 9.4,我正在寻找一种方法来合并查询中的两个(或更多)jsonjsonb列.以下表为例:

  id | json1        | json2
----------------------------------------
  1   | {'a':'b'}   | {'c':'d'}
  2   | {'a1':'b2'} | {'f':{'g' : 'h'}}
Run Code Online (Sandbox Code Playgroud)

是否可以让查询返回以下内容:

  id | json
----------------------------------------
  1   | {'a':'b', 'c':'d'}
  2   | {'a1':'b2', 'f':{'g' : 'h'}}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法定义此处所述的功能.这可能是"传统"查询吗?

postgresql json jsonb postgresql-9.4

36
推荐指数
7
解决办法
3万
查看次数

Rails和jsonb类型"jsonb"不存在

psql --version
psql (PostgreSQL) 9.4.1

rails -v
Rails 4.2.0
Run Code Online (Sandbox Code Playgroud)

我通过迁移添加了一个jsonb列

class AddPreferencesToUsers < ActiveRecord::Migration
  def change
    add_column :users, :preferences, :jsonb, null: false, default: '{}'
    add_index :users, :preferences, using: :gin
  end
end
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

PG::UndefinedObject: ERROR:  type "jsonb" does not exist
LINE 1: SELECT 'jsonb'::regtype::oid
Run Code Online (Sandbox Code Playgroud)

任何帮助?

postgresql ruby-on-rails jsonb

34
推荐指数
1
解决办法
2万
查看次数

如何将PostgreSQL 9.4的jsonb类型转换为float

我正在尝试以下查询:

SELECT (json_data->'position'->'lat') + 1.0 AS lat FROM updates LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

(+ 1.0只是强制转换为浮点数.我的实际查询要复杂得多,这个查询只是问题的一个测试用例.)

我收到错误:

ERROR:  operator does not exist: jsonb + numeric
Run Code Online (Sandbox Code Playgroud)

如果我添加显式转换:

SELECT (json_data->'position'->'lat')::float + 1.0 AS lat FROM updates LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

错误变成:

ERROR:  operator does not exist: jsonb + double precesion
Run Code Online (Sandbox Code Playgroud)

我知道大多数jsonb值都不能转换成浮点数,但在这种情况下我知道lats都是JSON数.

是否有一个函数将jsonb值转换为浮点数(或为uncastable返回NULL)?

sql postgresql casting jsonb postgresql-9.4

33
推荐指数
5
解决办法
4万
查看次数

将PostgreSQL JSON列升级到JSONB?

升级到PostgreSQL 9.4之后,如何将所有JSON列转换为JSONB列?

我不介意丢失任何重复的密钥和空白.

postgresql jsonb

33
推荐指数
2
解决办法
6432
查看次数