sql >> データベース >  >> NoSQL >> MongoDB

PostgresJSON配列内のクエリ

    次の元の回答は、Postgres9.3にのみ適用されます。 Postgres 9.4の回答については、以下の更新を参照してください。

    これは、Erwinが参照した回答 に基づいています。 、しかし、この質問にはもう少し明確です。

    この場合のIDはbigintです。 sなので、JSON配列をPostgres bigintに変換するためのヘルパー関数を作成します。 配列:

    CREATE OR REPLACE FUNCTION json_array_bigint(_j json)
      RETURNS bigint[] AS
    $$
    SELECT array_agg(elem::text::bigint)
    FROM json_array_elements(_j) AS elem
    $$
      LANGUAGE sql IMMUTABLE;
    

    text を簡単に(そしておそらくもっと再利用可能に)返すことができたはずです。 代わりにここに配列します。 bigintでのインデックス作成が疑われます textよりもはるかに高速です しかし、それを裏付ける証拠をオンラインで見つけるのに苦労しています。

    インデックスを作成する場合:

    CREATE INDEX "myindex" ON "mytable" 
      USING GIN (json_array_bigint("blob"->'ids'));
    

    クエリの場合、これは機能し、インデックスを使用します:

    SELECT * FROM "mytable" 
      WHERE '{185603363289694211}' <@ json_array_bigint("blob"->'ids');
    

    これを行うとクエリでも機能しますが、インデックスは使用されません:

    SELECT * FROM "mytable" 
      WHERE 185603363289694211 = ANY(json_array_bigint("blob"->'ids'));
    

    9.4のアップデート

    Postgres9.4はjsonbを導入しました タイプ。 これはjsonbについての良い答えです jsonで使用する必要がある場合 。つまり、JSONをクエリする場合は、 jsonbを使用する必要があります。 。

    jsonbとして列を作成する場合 、次のクエリを使用できます:

    SELECT * FROM "mytable"
      WHERE blob @> '{"ids": [185603363289694211]}';
    

    @> is Postgres'には演算子が含まれ、 jsonbの場合 ここアランの回答 に感​​謝します これを私の注意を引いてくれて。



    1. Pythonでjson.load中にキーを編集/名前変更するにはどうすればよいですか?

    2. 非同期関数node.jsからの戻り値

    3. TLSを使用したRedisSentinels

    4. MongooseでIDの最初の出現のみを返す方法は?