标签: jsonb

更新 jsonb 列中的 bool 值 - jsonb_set

以下面的 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)

sql postgresql jsonb

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

Postgres - 选择大型 jsonb 列的性能

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)

postgresql indexing performance json jsonb

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

创建活动记录范围以在 Jsonb 字段上排序

我有一个名为 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 列中的字段进行排序的范围?

activerecord ruby-on-rails sql-order-by jsonb

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

如何将 JsonNode 参数(micronaut + kotlin)保存为 postgres 数据库中的 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)

postgresql kotlin jsonb jsonnode micronaut-data

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

jsonb对象数组和列的合并困难

我有一张桌子

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)

sql postgresql json jsonb

1
推荐指数
1
解决办法
963
查看次数

在Postgresql中将记录数组转换为JSON

我在使用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)

python sql postgresql json jsonb

1
推荐指数
1
解决办法
2967
查看次数

在postgres jsonb数组中查找对象的位置

我有一个在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 node.js jsonb

1
推荐指数
1
解决办法
676
查看次数

在PostgreSQL 9.5中将包含json对象的数组作为行插入

刚开始使用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)

postgresql psycopg2 jsonb

1
推荐指数
1
解决办法
3022
查看次数

具有activerecord select的jsonb字段的返回元素

如何从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)

activerecord ruby-on-rails jsonb

1
推荐指数
1
解决办法
1601
查看次数

Postgres Json(b)int数组包含任何数组值

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;

基本上将整数转换为字符串。

sql postgresql json jsonb

1
推荐指数
1
解决办法
3807
查看次数