【问题标题】:How do you create a Postgresql JSONB array in array index?如何在数组索引中创建 Postgresql JSONB 数组?
【发布时间】:2015-01-22 11:08:56
【问题描述】:

我有这样的结构:user_id, a.

a 是 jsonb 类型,结构如下:

{ b: 
   [
     {ids: [1,2,3,4]}, 
     {ids: [2,3,4]}, 
     {ids: [1,2,4]}, 
     ...
   ]
}

如何创建一个索引,使我能够在 ids 列表中找到所有具有特定 id 的用户 (user_id)?

【问题讨论】:

    标签: arrays postgresql indexing jsonb postgresql-9.4


    【解决方案1】:

    GIN index是你想要的吗?

    看来您首先需要将 ID 组织成更易于处理的形式。我对 Python 比对 PostgreSQL 操作 JSON 的方式更熟悉,所以我为此使用了 PL/Python。

       DROP TABLE IF EXISTS ids;
    
    CREATE TABLE ids (user_id integer, a jsonb);
    
    INSERT INTO ids VALUES 
        (1, '{"b": [{"ids": [1, 2, 3, 4]}, {"ids": [2, 3, 4]}, {"ids": [1, 2, 4]}]}'),
        (2, '{"b": [{"ids": [2, 3, 4]}]}'),
        (3, '{"b": [{"ids": [4, 5, 6]}, {"ids": [6, 7, 8]}]}');
    
    CREATE OR REPLACE FUNCTION extract_ids(a_json jsonb) 
    RETURNS int[] AS
    $BODY$
        import json
        s = set()
        a = json.loads(a_json)
        for key in a.keys():
            for id_set in a[key]:
                s.update(id_set['ids'])
        return(list(s))
    $BODY$ LANGUAGE plpythonu IMMUTABLE;
    
    SELECT user_id, extract_ids(a)
    FROM ids;
    
    CREATE INDEX ON ids USING gin (extract_ids(a));
    
    SELECT user_id 
    FROM ids
    WHERE ARRAY[3] <@ extract_ids(a);
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 2021-04-23
      • 2017-04-12
      • 2018-05-29
      • 2019-03-21
      相关资源
      最近更新 更多