标签: jsonb

JSONb日期:内部的实际日期?

我正在使用postgresql jdbc适配器将一堆数据迁移到jsonb字段(postgres 9.4).

导入后,日期字段看起来正确但显示为双引号.有没有办法判断它们是否实际存储在内部作为日期值?如果它们是字符串,我认为范围查找不会非常有效.

例如,propertiesjsonb字段中的条目如下所示:

"founded_on": "Sep 1, 2012 12:00:00 AM",

我现在可以搜索,比方说,

SELECT CAST(properties->>'founded_on' AS DATE

SELECT extract('year' from cast(properties->>'founded_on' as timestamp))

并且两者都工作正常,但不要告诉我Postgres是否每次都在jsonb字段中重新分析字符串值作为日期.

我可以创建一个索引,我将这些值转换为日期,并使用它来搜索,但它似乎有点不优雅.我真的更愿意知道存储的值是一个日期.整数和浮点数似乎是它们的实际原始值,而不是字符串,如下所示:

shares_sold": 5900000,

"latitude": 33.561467,

任何反馈都高度赞赏.

postgresql date jsonb

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

在Postgres中有效搜索整个1级嵌套JSONB

假设我们需要检查jsonb列是否包含由任何值(非嵌套,仅第一级)中的子字符串匹配的特定值.

如何有效地优化查询以搜索值的整个JSONB列(这意味着每个键)?

是否有一些很好的替代方法可以ILIKE %val%对jsonb数据类型进行文本转换?

jsonb_each_text(jsonb_column) ILIKE '%val%'
Run Code Online (Sandbox Code Playgroud)

作为示例,请考虑以下数据:

SELECT 
  '{
   "col1": "somevalue", 
   "col2": 5.5, 
   "col3": 2016-01-01, 
   "col4": "othervalue", 
   "col5": "yet_another_value"
  }'::JSONB
Run Code Online (Sandbox Code Playgroud)

当需要%val%在包含jsonb列中不同行的不同键配置的记录中搜索模式时,您将如何优化查询?

我知道用前面和后面的%符号搜索是低效的,因此寻找更好的方法,但很难找到一个.此外,显式索引json列中的所有字段不是一个选项,因为它们对于每种类型的记录都有所不同,并且会创建一大组索引(并非每行都有相同的键集).

是否有更好的替代方法可以将每个键值对提取到文本并执行ILIKE/POSIX搜索?

postgresql lookup jsonb postgresql-9.5

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

PostgreSQL JSONB - 具有变量键名的查询条件

我已经阅读了各种JSONB教程:

请考虑以下示例.

一张叫做的桌子plans.它包含以下列:

  1. id (整数,自动递增主键).
  2. name (串).
  3. structure (jsonb).

结构列具有常规JSON对象,具有以下结构:

{
  "some_unique_id": {
    "key1": "valueA",   // Fixed key name.
    "key2": "valueB"    // Fixed key name.
  },
  "another_unique_id": {
    "key1": "valueC",   // Fixed key name.
    "key2": "valueB"    // Fixed key name.
  },
  ...                   // can go on up to a 1000 items.
}
Run Code Online (Sandbox Code Playgroud)

注意:最外面的键是动态的.他们改变了每个项目. 这些值只是常规的JSON对象.没什么特别的.

我使用UUID作为结构中的键,因此如果我知道它的UUID,它很容易查找和检索特定值.

另一个选项是使我的结构成为一个对象数组(并将UUID作为值放在每个对象中),如下所示:

[
  {
    "uuid": "some_unique_id",
    "key1": "valueA",   // Fixed key name.
    "key2": "valueB"    // Fixed key …
Run Code Online (Sandbox Code Playgroud)

postgresql json jsonb

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

查询 jsonb 数组的整数成员

背景:我们使用 PaperTrail 来保存我们不断变化的模型的历史。现在我想查询属于某个客户的项目。PaperTrail 可选择存储object_changes,我需要查询此字段以了解何时使用此 ID 创建或更改为此 ID。

我的表看起来像这样简化:

item_type | object_changes
----------|----------------------------------------------------------
"Item"    | {"customer_id": [null, 5], "other": [null, "change"]}
"Item"    | {"customer_id": [4, 5], "other": ["unrelated", "change"]}
"Item"    | {"customer_id": [5, 6], "other": ["asht", "asht"]}
Run Code Online (Sandbox Code Playgroud)

如何查询从 ID 5 更改为或更改为 ID 5 的元素(所以上面的所有行)?我试过:

SELECT * FROM versions WHERE object_changes->'customer_id' ? 5;
Run Code Online (Sandbox Code Playgroud)

这让我:

ERROR:  operator does not exist: jsonb ? integer
LINE 1: ...T * FROM versions WHERE object_changes->'customer_id' ? 5;
                                                                 ^
HINT:  No operator matches the given name …
Run Code Online (Sandbox Code Playgroud)

postgresql ruby-on-rails paper-trail-gem jsonb postgresql-9.6

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

带有 jpa 属性转换器的 PostgreSQL jsonb 类型

我有一个包含“jsonb”类型列的表。\n在实体中,我使用属性转换器为此列设置了字符串类型:

\n\n
@Convert(converter = JSONBConverter.class)\n@Column(name = STATE_COLUMN, nullable = false)\nprivate String getState() {\n    return state;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的转换器看起来像:

\n\n
@Converter\npublic class JSONBConverter implements AttributeConverter<String, Object> {\n    @Override\n    public Object convertToDatabaseColumn(String attribute) {\n        PGobject result = new PGobject();\n        result.setType("json");\n        try {\n            result.setValue(attribute);\n        } catch (SQLException e) {\n            throw new IllegalArgumentException("Unable to set jsonb value");\n        }\n        return result;\n    }\n\n    @Override\n    public String convertToEntityAttribute(Object dbData) {\n        if (dbData instanceof PGobject) {\n            return ((PGobject) dbData).getValue();\n        }\n        return StringUtils.EMPTY;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我将方言设置为:org.hibernate.dialect.PostgreSQL95Dialect

\n\n

我以为它会起作用。但我收到一个错误:

\n\n …

java postgresql jpa jsonb

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

Rails jsonb - 将 jsonb 保存到 Postgresql 数据库时,防止 JSON 键重新排序

我有一个列amount_splits,我需要按照我指定的键顺序将我的 JSON 保存到其中。

jsonbJSON 键保存到数据库时,如何防止 Rails / Postgres自动对其进行排序?(用于创建或更新)

看起来它试图按字母顺序排序,但做得很差。

这是我要保存的内容:

{
    "str_fee": 3.17,       # key 1
    "eva_fee": 14.37,      # key 2
    "fran_royalty": 14.37, # key 3
    "fran_amount": 67.09   # key 4
}
Run Code Online (Sandbox Code Playgroud)

这是它实际保存的方式:

{
    "eva_fee": 14.37,     # key 2
    "str_fee": 3.17,      # key 1
    "fran_amount": 67.09, # key 4
    "fran_royalty": 14.37 # key 3
}
Run Code Online (Sandbox Code Playgroud)

目的:

在您回答“在接收端消耗 JSON 时排序无关紧要”之前,请先停下来想一想……然后请继续阅读

我需要按照我需要的方式对键进行排序,因为使用此 JSON 的客户端界面正在向开发人员显示 JSON,这些开发人员需要按照文档告诉他们的顺序来显示 JSON。以及它需要的原因按照这个顺序是首先显示什么计算发生的过程:

正确的顺序告诉开发者:

首先str_fee应用 ,然后应用eva_fee,然后是fran_royalty... …

postgresql json ruby-on-rails jsonb ruby-on-rails-5

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

PostgreSQL:查询 JSON 数组中的元素

我有一个如下所示的数据库表:

---------------------------------------
| id | json_array (jsonb)             |
---------------------------------------
|  1 | [{"a": 1}, {"a": 5}, {"a": 1}] |
|  2 | [{"a": 2}]                     |
|  3 | [{"a": 1}]                     |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想使用 PostgreSQL 的 JSON 查询功能来选择json_array数组中的某些子字典,例如字典 where "a": 1

输出应该是

------------------
| id | json_dict |
------------------
|  1 | {"a": 1}  |
|  1 | {"a": 1}  |
|  3 | {"a": 1}  |
------------------
Run Code Online (Sandbox Code Playgroud)

以下查询适用于每个数组中的第一个元素,但我想检查所有元素:

---------------------------------------
| id | json_array (jsonb)             |
---------------------------------------
| …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json jsonb

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

postgresql将结构化数据插入jsonb

我使用 PostgreSQL 10.11 并且希望将以下结构输入 jsonb 字段:

{
 lead: {
    name: string,
    prep: boolean
 },
 secondary: {
   {
       name: string,
        prep: boolean
    },
    {
        name: string,
        prep: boolean
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,lead 是一个带有 name 和 prep 的对象, secondary 是一个包含 name 和 prep 的数组。我怎样才能做到这一点?下面的脚本是创建一个带有 jsonb 字段的表:

CREATE TABLE public.test01 (
  name JSONB DEFAULT '{}'::jsonb NOT NULL
) 
WITH (oids = false);

ALTER TABLE public.test01
  ALTER COLUMN id SET STATISTICS 0;

COMMENT ON COLUMN public.test01.name
IS '''[]''';


ALTER TABLE public.test01
  OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

我正在尝试此插入但出现错误: …

sql postgresql json sql-insert jsonb

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

的用法?在 jsonb 上的本机 SQL 查询中

我需要针对 Postgres 列触发选择查询jsonb

entityManager.createNativeQuery(
 "select * from table where jsonbcol -> 'usernames' ? :un"
).setParameter("un", userName).getResultList()
Run Code Online (Sandbox Code Playgroud)

运行时抛出异常:

org.hibernate.engine.query.ParameterRecognitionException: Mixed parameter strategies - 
use just one of named, positional or JPA-ordinal strategy
Run Code Online (Sandbox Code Playgroud)

我尝试像\\?和 一样逃避??,但这没有帮助。

如何正确地进行该调用?

java postgresql hibernate jpa jsonb

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

如何在jsonb中添加新的键值对而不创建新对象?(Postgres)

我需要将新的键值对添加到现有的 json 对象中。将不胜感激任何帮助。

格式:

{
  "json_col": [
    {
      "val1": 1,
      "val2": 0,
      "val3": "qwe"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想出了这个查询

UPDATE table SET  
json_col = jsonb_set(
    json_col, 
    '{json_col}', json_col->'json_col' || '{"test":123}'))
where id=6400
Run Code Online (Sandbox Code Playgroud)

它会输出:

UPDATE table SET  
json_col = jsonb_set(
    json_col, 
    '{json_col}', json_col->'json_col' || '{"test":123}'))
where id=6400
Run Code Online (Sandbox Code Playgroud)

但我需要这个 json 成为单个对象(没有额外的括号),如下所示:

{
  "json_col": [
    {
      "val1": 1,
      "val2": 0,
      "val3": "qwe"
    },
    {
      "test": 123
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

postgresql json jsonb

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