查看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)
这个文件记录在哪里,我错过了吗?谢谢.
我正在尝试测试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专家,所以我不知道我做错了什么.
我有一个看起来像这样的表:
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),但是不使用索引并且查询实际上明显更慢.
我正在使用Postgres的json数据类型,但想要使用嵌套在json中的数据进行查询/排序.
我想在json数据类型上使用.where进行排序或查询.例如,我想查询跟随者数> 500的用户,或者我想通过关注者或跟随计数来订购.
谢谢!
例:
model User
data: {
"photos"=>[
{"type"=>"facebook", "type_id"=>"facebook", "type_name"=>"Facebook", "url"=>"facebook.com"}
],
"social_profiles"=>[
{"type"=>"vimeo", "type_id"=>"vimeo", "type_name"=>"Vimeo", "url"=>"http://vimeo.com/", "username"=>"v", "id"=>"1"},
{"bio"=>"I am not a person, but a series of plants", "followers"=>1500, "following"=>240, "type"=>"twitter", "type_id"=>"twitter", "type_name"=>"Twitter", "url"=>"http://www.twitter.com/", "username"=>"123", "id"=>"123"}
]
}
Run Code Online (Sandbox Code Playgroud) 我正在努力将JSON对象插入到postgres v9.4 DB中.我已将名为"evtjson"的列定义为类型json (不是jsonb).
我试图在Java(jdk1.8)中使用预准备语句将Json对象(使用JEE javax.json库构建)插入到列中,但是我一直遇到SQLException错误.
我使用以下方法创建JSON对象:
JsonObject mbrLogRec = Json.createObjectBuilder().build();
…
mbrLogRec = Json.createObjectBuilder()
.add("New MbrID", newId)
.build();
Run Code Online (Sandbox Code Playgroud)
然后我将此对象作为参数传递给另一个方法,以使用预准备语句将其写入DB.(以及其他几个领域)作为:
pStmt.setObject(11, dtlRec);
Run Code Online (Sandbox Code Playgroud)
使用此方法,我收到以下错误:
org.postgresql.util.PSQLException:未安装hstore扩展.at org.postgresql.jdbc.PgPreparedStatement.setMap(PgPreparedStatement.java:553)at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1036)
我也尝试过:
pStmt.setString(11, dtlRec.toString());
pStmt.setObject(11, dtlRec.toString());
Run Code Online (Sandbox Code Playgroud)
哪会产生不同的错误:
事件JSON:{"New MbrID":29}
SQLException:错误:列"evtjson"的类型为json,但表达式的类型为字符变化
提示:您需要重写或转换表达式.
但是,至少这告诉我DB正在将列识别为JSON类型.我确实尝试安装hstore扩展,但它告诉我它不是一个hstore对象.
OracleDocs显示了许多用于在preparedStatement中设置参数值的方法,但如果有人知道答案,我宁愿不尝试所有方法.(http://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html)这些还引用了一个额外的参数,SQLTYPE,但我不能找到这些任何引用.
我应该试试setAsciiStream吗?CharacterStream?CLOB?
最近升级到使用PostgreSQL 9.3.1来利用JSON功能.在我的表中,我有一个json类型的列,其结构如下:
{
"id": "123",
"name": "foo",
"emails":[
{
"id": "123",
"address": "somethinghere"
},
{
"id": "456",
"address": "soemthing"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这只是用于问题目的的虚拟数据.
是否可以根据ID查询电子邮件数组中的特定项?
差不多:"返回id = 123的电子邮件""?
您将如何搜索存储在json列中的数组中的元素? (更新:另请参阅jsonb列的9.4更新答案.)
如果我有这样的JSON文档,则存储在json名为的列中blob:
{"name": "Wolf",
"ids": [185603363281305602,185603363289694211]}
Run Code Online (Sandbox Code Playgroud)
我希望能做的是:
SELECT * from "mytable" WHERE 185603363289694211 = ANY("blob"->'ids');
Run Code Online (Sandbox Code Playgroud)
并获取所有匹配的行.但这不起作用,因为"blob"->'ids'返回JSON值,而不是Postgres数组.
如果可能的话,我还想建立个人ID的索引.
我在数据库(postgres 9.2.1)中有一个文本字段,其中包含一个json blob.它看起来与此类似,除了所有在一行上,显然:
{
"keyword": {
"checked": "1",
"label": "Keyword"
},
"agency_name": {
"checked": "0",
"label": "Agency Name"
}
}
Run Code Online (Sandbox Code Playgroud)
我需要向json数组添加一个元素,使它看起来像这样:
{
"keyword": {
"checked": "1",
"label": "Keyword"
},
"something_new": {
"checked": "1",
"label": "Something New"
},
"agency_name": {
"checked": "0",
"label": "Agency Name"
}
}
Run Code Online (Sandbox Code Playgroud)
我并不关心新数组元素的位置.它可以在agency_name之后.在postgres中有一个简单的方法吗?
PosgresSQL中JSON和JSONB数据类型有什么区别?
我使用PostgreSQL 9.5和Rails 5.我想查询jsonb下面显示的包含JSON对象数组的列,以返回包含的所有JSON数组元素{"kind":"person"}并执行计数.我使用
的SQL显示在json数据下面.运行查询只返回一个空数组.
这就是我的jsonb数据:
'[
{"kind":"person", "filter_term":"56","selected_attr":"customer"},
{"kind":"email", "filter_term":"marketer","selected_attr":"job_title"}
]'
Run Code Online (Sandbox Code Playgroud)
我想要一个sql查询返回:
data
----------------------------------------------------------------------
'{"kind":"person", "filter_term":"56","selected_attr":"customer"}'
(1 row)
Run Code Online (Sandbox Code Playgroud)
和另一个返回数组的查询,以便我可以在我的应用程序中调用count并在其上循环以创建表单:
data
----------------------------------------------------------------------
'[{"kind":"person", "filter_term":"56","selected_attr":"customer"}]'
(1 row)
Run Code Online (Sandbox Code Playgroud)
我试过这个SQL查询:
"SELECT * FROM \"segments\" WHERE (payload @> '[{\"kind\":\"person\"}]')"
Run Code Online (Sandbox Code Playgroud)
我也试过这个查询:
"SELECT payload FROM segments WHERE payload @> '[{\"kind\":\"person\"}]'::jsonb;"
Run Code Online (Sandbox Code Playgroud)
这是第三个查询:
"SELECT * FROM segments s WHERE s.payload->'\"#{a}\"' @> '[{\"kind\":\"person\"}]';"
Run Code Online (Sandbox Code Playgroud)
该模型:
class Segment < ApplicationRecord
store_accessor :payload,:kind, :filter_term, :selected_model_name, :selected_attr, :limit, :selected_operator …Run Code Online (Sandbox Code Playgroud)