Couchbase N1QL数组查询

Couchbase N1QL数组查询,couchbase,n1ql,Couchbase,N1ql,我的giata_物业bucket中的文档样本: 相关json粘贴 { "propertyCodes": { "provider": [ { "code": [ { "value": [ { "value": "304387" } ] } ], "pro

我的
giata_物业
bucket中的文档样本:

相关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.value
propertyCodes.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;

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

以下是查询和索引

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 );
查询

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 );

看看链接。请将单个文档的相关部分添加到此问题。谢谢,查询和索引非常有效。对一件事很好奇,创建了
idx\u值
,然后
EXPLAIN
显示查询仅使用了
idx\u值
,速度非常快,然后我创建了
idx\u提供者代码
,并且
EXPLAIN
显示查询现在使用了这两个索引。在使用两个索引和一个索引的查询之间,没有测量到性能改进,您能解释一下吗?解释好输出,IntersectScan不是免费的。此外,如果索引在同一个节点上,它们共享资源(CPU、内存),因此可能不会有加速。那么,在我的情况下,我的问题是,我是否可以创建一个单一的复合索引以避免
交叉扫描
并坚持
索引扫描
可能?如果我的查询仅使用索引
idx_值
工作,为什么我需要两个索引?通常需要两个索引。如果您的idx_值比idx_providerCode更具选择性,那么请仅使用idx_值。这完全取决于您的数据分布。