Couchbase N1QL数组查询

时间:2016-10-16 15:25:18

标签: couchbase n1ql

来自giata_properties广告管理系统的文档示例:link

相关的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的文档。我已设法单独执行每项操作,但我不确定如何在单个查询中合并它们。

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;

例如,我想获取包含propertyCodes.provider.code.value.value 304387 providerhotelbeds也是overflow: hidden;的文档,因为代码值可以在文档上重复,但是code和providerCode组合是唯一的。

1 个答案:

答案 0 :(得分: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 );