以下面的 json 为例:
{
"red": false,
"blue": false,
"yellow": false
}
Run Code Online (Sandbox Code Playgroud)
我必须将其中一个元素更新为 true,预期结果是:
{
"red": false,
"blue": false,
"yellow": true
}
Run Code Online (Sandbox Code Playgroud)
首先,我尝试以这种方式更新:
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', ('"true"')::jsonb, true)
Run Code Online (Sandbox Code Playgroud)
但结果却是
{
"red": false,
"blue": false,
"yellow": "true"
}
Run Code Online (Sandbox Code Playgroud)
不是我想要的,它是一个字符串,而不是布尔值
还尝试过:
UPDATE table_name
SET jsonb_column_name = jsonb_set(jsonb_column_name, '{yellow}', true, true)
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误,这是有道理的,第三个参数必须是 jsonb
SQL Error [42883]: ERROR: function jsonb_set(jsonb, unknown, boolean, boolean) does not exist
Hint: No function matches the given name and argument types. You might need to add …Run Code Online (Sandbox Code Playgroud) jsonb我们在数据库表之一中使用 Postgres类型。表结构如下所示:
CREATE TABLE IF NOT EXISTS public.draft_document (
id bigserial NOT NULL PRIMARY KEY,
...
document jsonb NOT NULL,
ein_search character varying(11) NOT NULL
);
CREATE INDEX IF NOT EXISTS count_draft_document_idx ON public.draft_document USING btree (ein_search);
CREATE INDEX IF NOT EXISTS read_draft_document_idx ON public.draft_document USING btree (id, ein_search);
Run Code Online (Sandbox Code Playgroud)
列的 json 结构document可能会有所不同。下面是一个可能的架构示例document:
"withholdingCredit": {
"type": "array",
"items": {
"$ref": "#/definitions/withholding"
}
}
Run Code Online (Sandbox Code Playgroud)
其中withholding结构(数组元素)遵循:
"withholding": {
"properties": {
...
"proportionalityIndicator": {
"type": "boolean"
}, …Run Code Online (Sandbox Code Playgroud) 我有一个名为 session 的表,其中包含一个名为 lms_data 的 jsonb 属性。我想创建一个范围以按 jsonb 列中的特定字段进行排序。以下查询运行良好select * from sessions ORDER BY lms_data->>'startDate' ASC
,但是会话模型中的以下范围不会执行:
scope :order_by_start_date_asc, -> { order("lms_data->>'startDate' ASC ") }
Run Code Online (Sandbox Code Playgroud)
它失败了Query method called with non-attribute argument(s): "lms_data->>'startDate' ASC "
如何创建基于 jsonb 列中的字段进行排序的范围?
我正在尝试保存一个具有 JsonNode 属性的实体,并且必须将其转换为 jsonb 才能存储在 postgres 数据库中。
这是数据库表:
CREATE TABLE IF NOT EXISTS configuration_data (
id SERIAL NOT NULL PRIMARY KEY,
namespace_name TEXT NOT NULL,
dimension_id TEXT NOT NULL,
dimension_value TEXT,
path TEXT,
data JSONB,
version BIGINT DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)
这是实体:
@MappedEntity(value = "configuration_data")
data class ConfigurationDataEntity(
@field:Id @GeneratedValue
val id: Long,
@MappedProperty("namespace_name")
val namespaceName: String,
@MappedProperty("dimension_id")
val dimensionId: String,
@MappedProperty("dimension_value")
val dimensionValue: String,
@MappedProperty("path")
val path: String,
@MappedProperty("data")
val data: JsonNode,
@MappedProperty("version")
val version: Long,
)
Run Code Online (Sandbox Code Playgroud)
我正在尝试将这样的实体保存到存储库中:
val entity …Run Code Online (Sandbox Code Playgroud) 我有一张桌子
Visitor: (id, signup_up, sessions, email, custom_fields)
custom_fields表单的JSON对象的jsonb数组在哪里
CustomField: ( field, value ) 例: (domain, www.somedomain.com)
我想获取signed_up, sessions, email列和它们的值,以及数组中的CustomFieldjson对象custom_fields,并将它们合并到data使用相同CustomField结构调用的第3个字段中,即.每个条目都有表格field: value.
例
鉴于这些行
id | sessions | email | custom_fields
---------------------------------------------------------------
1 | 3 | test@gmail.com [{ field: domain, value: "www.hello.com" }, { field: type, value: "Customer" }]
---------------------------------------------------------------
2 | 5 | another@gmail.com [{ field: domain, value: "www.other.com" }, { field: type, value: "Customer" }]
Run Code Online (Sandbox Code Playgroud)
我想得到
id …Run Code Online (Sandbox Code Playgroud) 我在使用Postgresql将记录数组转换为JSON时遇到问题。
版本: psql(PostgreSQL)9.5.3
当前查询:
SELECT c.id, (select array(
select (cp.id,cp.position)
from contactposition cp
where cp.contact_id_id = c.id -- join on the two tables
)
) as contactpositions
from contacts c;
Run Code Online (Sandbox Code Playgroud)
表中的联系人contacts可以从表中分配许多职位contactposition。
结果是这样的:
| id (integer) | contactpositions (record[]) |
|--------------|----------------------------------------------------------------------|
| 5 | {"(21171326,\"Software Developer\")","(21171325,Contractor)" (...)"} |
Run Code Online (Sandbox Code Playgroud)
但是我希望它是这样的:
| id (integer) | contactpositions (record[]) |
|--------------|----------------------------------------------------------------------|
| 5 | [{"id": 21171326, "position": "Software Developer", "id": 21171325, "position": "Contractor", (...)] |
Run Code Online (Sandbox Code Playgroud)
我知道一些辅助功能,例如array_to_json,但是我无法使其正常工作。
我试过了:
SELECT c.id, …Run Code Online (Sandbox Code Playgroud) 我有一个在value表的jsonb 列中看起来像这样的对象数组:
"west": [
{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}
]
Run Code Online (Sandbox Code Playgroud)
我的目标是根据它们的id和版本从这个数组中删除某些对象,如下所示:
SELECT value::jsonb #- '{west, 1}' FROM game.settings;
Run Code Online (Sandbox Code Playgroud)
但是,它1不应该是硬编码的,而应该等于数组中对象的位置,该位置与我正在寻找的id和版本相匹配(在本例中"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3).
我将如何确定此阵列位置并将其传递到我的硬编码1当前保存的位置?
刚开始使用PostgreSQL 9.5,就遇到了jsonb列的第一个问题。我一直在努力寻找答案,但失败了。有人可以帮忙吗?
我在python中有一个包含以下json对象的json数组:
[{"name":"foo", "age":"18"}, {"name":"bar", "age":"18"}]
Run Code Online (Sandbox Code Playgroud)
我正在尝试将此插入到jsonb列中,如下所示:
COPY person(person_jsonb) FROM '/path/to/my/json/file.json';
Run Code Online (Sandbox Code Playgroud)
但是只插入了1行。我希望将数组中的每个json对象都添加为新行,如下所示:
1. {"name":"foo", "age":"18"}
2. {"name":"bar", "age":"18"}
Run Code Online (Sandbox Code Playgroud)
还尝试了:
INSERT INTO person(person_jsonb)
VALUES (%s)
,(json.dumps(data['person'])
Run Code Online (Sandbox Code Playgroud)
仍然只插入一行。有人可以帮忙吗?
编辑:根据要求添加了python代码
import psycopg2, sys, json
con = None
orders_file_path = '/path/to/my/json/person.json'
try:
with open(orders_file_path) as data_file:
data = json.load(data_file)
con = psycopg2.connect(...)
cur = con.cursor()
person = data['person']
cur.execute("""
INSERT INTO orders(orders_jsonb)
VALUES (%s)
""", (json.dumps(person), ))
con.commit()
except psycopg2.DatabaseError, e:
if con:
con.rollback()
finally:
if con:
con.close()
Run Code Online (Sandbox Code Playgroud)
person.json文件:
{"person":[{"name":"foo", "age":"18"}, {"name":"bar", "age":"18"}]}
Run Code Online (Sandbox Code Playgroud) 如何从jsonb存储字段中“选择”值?
例如
@model1:
data: {"special_date" => "Wed, 16 Mar 2016 11:20:20 -0700", ....}
@model2:
data: {"special_date" => "Wed, 23 Mar 2016 11:20:20 -0700", ....}
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西
Model.all.select("data -> 'special_date'")
Run Code Online (Sandbox Code Playgroud) TLDR:如何查找包含json数字数组的每条记录,其中json数字数组包含给定数组/列表的一个数字。
好的,我尝试了很多,读了很多其他线程,但是还没有找到可行的解决方案。我想在Postgres中找到一些JSON对象。它们包含多选选择的索引。
对象:
[{"id": 5, "list": [1, 2, 3]}, {"id": 6, "list": [4, 5, 6]}]
Run Code Online (Sandbox Code Playgroud)
我需要选择包含项目1或5的所有对象。目前,我只能检查一个值
SELECT '[1, 2, 3, 4]'::jsonb @> '3'::jsonb as result;
Run Code Online (Sandbox Code Playgroud)
或同时存在:
SELECT '[1,2,3,4]'::jsonb @> '[1, 2]'::jsonb as result;
Run Code Online (Sandbox Code Playgroud)
或者,有趣的是,如果我有一个字符串数组,我可以做我需要的事情:
SELECT '["1","2","3","4"]'::jsonb ?| array['1', '5'] as result;
Run Code Online (Sandbox Code Playgroud)
如何将此应用于JSON数字数组?我尝试将其转换为int []和许多其他内容。没事。我或者需要将数字数组转换为文本数组才能使用它,或者需要为右侧找到正确的类型。这也不起作用:?| array[1, 5]::text[]
解决方案1:
好吧,我和毛村人想到的第一件事,OR似乎仍然是最快,最简单的解决方案。
解决方案2:
我终于找到了一种使它更短的方法(就像我认为的那样),但这是一个令人难以置信的事情(也是9.4+),而且看起来也不漂亮:
SELECT array_to_json(translate('[1,2,3,4]'::jsonb::text, '[]', '{}')::text[])::jsonb ?| array['1','5'] as result;
基本上将整数转换为字符串。
jsonb ×10
postgresql ×8
json ×4
sql ×4
activerecord ×2
indexing ×1
jsonnode ×1
kotlin ×1
node.js ×1
performance ×1
psycopg2 ×1
python ×1
sql-order-by ×1