2016-10-16 13 views
1

ドキュメントのサンプル:linkのCouchbase N1QL配列クエリ

関連JSONペースト

{ 
    "propertyCodes": { 
    "provider": [ 
     { 
     "code": [ 
      { 
      "value": [ 
       { 
       "value": "304387" 
       } 
      ] 
      } 
     ], 
     "providerCode": "hotelbeds", 
     "providerType": "gds" 
     }, 
     { 
     "code": [ 
      { 
      "value": [ 
       { 
       "name": "Country Code", 
       "value": "EG" 
       }, 
       { 
       "name": "City Code", 
       "value": "HRG" 
       }, 
       { 
       "name": "Hotel Code", 
       "value": "91U" 
       } 
      ] 
      } 
     ], 
     "providerCode": "gta", 
     "providerType": "gds" 
     } 
    ] 
    }, 
    "name": "Arabia Azur Resort" 
} 

私は、クエリ(およびインデックス)はpropertyCodes.provider.code.value.valuepropertyCodes.provider.providerCodeに基づいてドキュメントを取得したいです。私はそれぞれ別々に管理してきましたが、私はそれらを両方とも1つのクエリでマージする方法がわかりません。

SELECT meta().id FROM giata_properties AS gp USE INDEX(`#primary`) WHERE ANY v WITHIN gp.propertyCodes.provider[*].code SATISFIES v.`value` = '150613' END; 

SELECT meta().id FROM giata_properties AS gp USE INDEX(`#primary`) WHERE ANY v within gp.propertyCodes.provider[*].providerCode SATISFIES v = 'hotelbeds' END; 

だから例えば私は304387propertyCodes.provider.code.value.valueとコード値は、文書上で複製することができるのでproviderは、またhotelbedsですが、コードとproviderCodeの組み合わせが一意であることが含まれる文書を取得したいです。

+0

リンクを参照してください。この質問には、1つの文書の関連するセクションを追加してください。 – geraldss

答えて

1

ここには、クエリとインデックスがあります。

クエリ。

SELECT META().id 
FROM giata_properties AS gp 
WHERE ANY p IN propertyCodes.provider SATISFIES (ANY v WITHIN p.code SATISFIES v.`value` = '304387' END) AND p.providerCode = 'hotelbeds' END; 

インデックス。

CREATE INDEX idx_value ON giata_properties 
(DISTINCT ARRAY (DISTINCT ARRAY v.`value` FOR v WITHIN p.code END) FOR p IN propertyCodes.provider END); 

CREATE INDEX idx_providerCode ON giata_properties 
(DISTINCT ARRAY p.providerCode FOR p IN propertyCodes.provider END); 
+0

ありがとう、クエリとインデックスがうまくいきます。 'idx_value'を作成した後、' EXPLAIN'が 'idx_value'だけで' idx_value'を使用していることを示していて、それがかなり高速だった場合、 'idx_providerCode'と' EXPLAIN'を作成して両方のインデックスを使用していることを示しました。両方のインデックスと単一のインデックスを使用したクエリ間でパフォーマンスの向上は測定されませんでしたが、少し説明してください。説明する出力http://pastebin.com/V1mk16iW – prettyvoid

+1

さて、IntersectScanは無料ではありません。また、インデックスが同じノード上にある場合、それらはリソース(CPU、メモリ)を共有しているため、スピードアップはできません。 – geraldss

+0

私の質問では、私の場合、 'IntertersectScan'を避け、' IndexScan'に固執する単一の合成インデックスを作成できますか? – prettyvoid