我正在考虑在Rails4.2和Postgres4.1中使用新的jsonb功能.
我正在寻找创建一个代表用户配置文件(即技能集等)的模型,并将整个事物存储在单个jsonb数据集中.
所以表格会有:
id int
profile jsonb
timestamps
Run Code Online (Sandbox Code Playgroud)
我以为我基本上可以将所有配置文件数据存储在jsonb结构中,如下所示(这只是一个示例/概念):
{
"basics": {
"name": "John Doe",
"label": "Programmer",
"picture": "",
"email": "john@gmail.com",
"phone": "(912) 555-4321",
"website": "http://johndoe.com",
"summary": "A summary of John Doe...",
"location": {
"address": "2712 Broadway St",
"postalCode": "CA 94115",
"city": "San Francisco",
"countryCode": "US",
"region": "California"
},
"profiles": [{
"network": "Twitter",
"username": "john",
"url": "http://twitter.com/john"
}]
},
"skills": [{
"name": "Web Development",
"level": "Master",
"keywords": [
"HTML",
"CSS",
"Javascript"
]
}],
"languages": [{
"language": "English",
"fluency": "Native speaker" …Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL 9.4,其中teams包含一个jsonb名为的列的表json.我正在寻找一个查询,我可以让所有拥有球员的球队3,4以及7他们的球员阵容.
该表包含两行,包含以下json数据:
第一排:
{
"id": 1,
"name": "foobar",
"members": {
"coach": {
"id": 1,
"name": "A dude"
},
"players": [
{
"id": 2,
"name": "B dude"
},
{
"id": 3,
"name": "C dude"
},
{
"id": 4,
"name": "D dude"
},
{
"id": 6,
"name": "F dude"
},
{
"id": 7,
"name": "G dude"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
第二排:
{
"id": 2,
"name": "bazbar",
"members": …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用"newish"JSONB类型.
我有一个documents带有propertiesjsonb字段的表,在那里是一个字段publication_year.我想查找一年范围内的所有文件记录,例如2013-2015. [编辑:查询一系列值是这里的主要挑战,即使我使用了下面的完全匹配示例.请求的方法也适用于美元范围(价格> 20美元,价格<40美元)或时间戳范围).
我试过了:
create index test1 on documents using gin ((cast(properties->'announced_on_year' as integer)));
ERROR: cannot cast type jsonb to integer
Run Code Online (Sandbox Code Playgroud)
以及:
create index test1 on documents using gin (cast(properties->>'publication_year' as integer));
ERROR: data type integer has no default operator class for access method "gin"
HINT: You must specify an operator class for the index or define a default operator class for the data type.`
Run Code Online (Sandbox Code Playgroud)
我从这篇文章中看到http://www.postgresql.org/message-id/10736.1409063604@sss.pgh.pa.us这应该是可能的,但我无法弄清楚正确的语法.
当我只做一个简单的索引:
create index test1 on …Run Code Online (Sandbox Code Playgroud) 使用PostgreSQL(v9.5),JSONB格式提供了很棒的机会.但现在我陷入了一个看似简单的操作;
比较两个jsonb对象; 看一个文档中哪个与另一个文档相比有什么不同或缺失.
到目前为止我有什么
WITH reports(id,DATA) AS (
VALUES (1,'{"a":"aaa", "b":"bbb", "c":"ccc"}'::jsonb),
(2,'{"a":"aaa", "b":"jjj", "d":"ddd"}'::jsonb) )
SELECT jsonb_object_agg(anon_1.key, anon_1.value)
FROM
(SELECT anon_2.key AS KEY,
reports.data -> anon_2.KEY AS value
FROM reports,
(SELECT DISTINCT jsonb_object_keys(reports.data) AS KEY
FROM reports) AS anon_2
ORDER BY reports.id DESC) AS anon_1
Run Code Online (Sandbox Code Playgroud)
应该返回第1行与第2行的差异:
'{"b":"bbb", "c":"ccc", "d":null}'
Run Code Online (Sandbox Code Playgroud)
相反,它也返回duplicates({"a": "aaa"}).也; 一般来说可能会有更优雅的方法!
我正在尝试使用Postgres作为文档存储,当我试图有效地插入Postgres解析器似乎不喜欢JSONB运算符的文档时遇到了问题.
我有一张桌子:
CREATE TABLE tbl (data jsonb NOT NULL);
CREATE UNIQUE INDEX ON tbl ((data->>'a'));
Run Code Online (Sandbox Code Playgroud)
我尝试插入数据:
INSERT INTO tbl (data) VALUES ('{ "a": "b" }'::jsonb)
ON CONFLICT (data->>a)
DO UPDATE SET data = data || '{ "a": "b" }'::jsonb
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
ERROR: syntax error at or near "->>"
Run Code Online (Sandbox Code Playgroud)
我已经尝试过数据 - >> a,data - >>'a',data-> a,也许数据 - >'a'.所有这些都是
我想将标识符列(示例中的a)保留在JSON中,而不是将其作为表中的列.
我目前正在尝试做什么?
通过使用jsonb_array_elements()函数jsonb从Postgres中提取数据数组,它给出了错误:
不能从标量中提取元素
我认为这是因为NULL在返回调用中,添加了NULL检查条件但不起作用.任何帮助赞赏.
select id ,
CASE
WHEN report IS NULL OR
(report->'stats_by_date') IS NULL OR
(report->'stats_by_date'-> 'date') IS NULL then to_json(0)::jsonb
ELSE jsonb_array_elements(report -> 'stats_by_date' -> 'date')
END AS Date
from factor_reports_table
Run Code Online (Sandbox Code Playgroud)
截断的json数组看起来像:
"stats_by_date":{"date":[16632,16633,16634,...],"imps":[2418,896,1005 ......],...}
如何使用Rails验证对象数组中的每个对象?
我正在我们的Rails应用程序中构建用户配置文件表单.在用户模型内部,我们有基本的字符串属性,但也有一些jsonb字段.JSONb字段默认为[]因为我们想要在该属性中存储对象数组.以下是简化用户模型属性的示例:
name: stringemail: stringeducation: jsonb, default: []教育是一系列对象,例如:
[{
school: 'Harvard university',
degree: 'Computer Science',
from_date: 'Tue, 11 Jul 2017 16:22:12 +0200`,
to_date: 'Tue, 11 Jul 2017 16:22:12 +0200'
},{
school: 'High school',
degree: 'Whatever',
from_date: 'Tue, 11 Jul 2017 16:22:12 +0200`,
to_date: 'Tue, 11 Jul 2017 16:22:12 +0200'
}]
Run Code Online (Sandbox Code Playgroud)
用户应该能够单击Add school按钮,通过jquery添加更多字段.那个jquery部分对于这个问题并不重要 - 可能只是解释了为什么我们使用了一个对象数组.
你如何验证教育数组中的每个项目,所以我可以用红色标记包含验证错误的文本字段?我被告知使用FormObject模式可能会有所帮助.我也尝试编写继承自ActiveModel::Validator类的自定义验证器,但主要问题仍然在于,我正在处理数组,而不是实际对象.
感谢任何建设性的帮助.
我正在研究使用Hibernate 5和PostgreSQL JSONB,但是我遇到了Hibernate正确支持它的问题.
你有任何解决方案,可能是库,如何实现对Hibernate + Spring JPA的JSONB支持?
此外,您可以通过这种方法注意到哪些优点和缺点?
所以我有这个想法,这真的超出了我的想象,因为我只编程了很短一段时间,但我想构建一个反应式 Spring webflux 应用程序,将 json 端点暴露给反应前端。
当我决定在 Postgres 中使用 jsonb 格式时,问题就开始了,因为我认为我可能会从数据库一直到前端层一直使用 json。
当我尝试使用反应式 R2dbc 驱动程序使用 jsonb SELECT 表时,出现以下错误:
Caused by: java.lang.IllegalArgumentException: 3802 is not a valid object id
Run Code Online (Sandbox Code Playgroud)
我在 postgres 中有一个表,如下所示:
Column | Type | Collation | Nullable | Default
---------+---------+-----------+----------+------------------------------
id | integer | | not null | generated always as identity
details | jsonb | | |
Indexes:
"snacks_new_pkey" PRIMARY KEY, btree (id)
Run Code Online (Sandbox Code Playgroud)
因此,如果我将其作为文本提取到 Spring webflux,它就可以正常工作,因为它不再是 json。
"SELECT id, details->>'name' as NAME, details->>'price' AS PRICE, details->>'quantity' AS QUANTITY …Run Code Online (Sandbox Code Playgroud) 我有这样的数据 -

所以我需要找出 id=203498 的所有行。我该如何为此编写查询?有帮助吗?