Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Couchbase 嵌套数组上的N1QL非重复查询_Couchbase_N1ql - Fatal编程技术网

Couchbase 嵌套数组上的N1QL非重复查询

Couchbase 嵌套数组上的N1QL非重复查询,couchbase,n1ql,Couchbase,N1ql,(Couchbase 4.5)假设我的Couchbase实例中存储了以下对象: { parentArray : [ { childArray: [{value: 'v1'}, {value:'v2'}] }, { childArray: [{value: 'v1'}, {value: 'v3'}] } ] } 现在我想从childArray中选择不同的元素,它应该返回一个等于['v1','v2','v3']的数组 我有一些解决办

(Couchbase 4.5)假设我的Couchbase实例中存储了以下对象:

{
  parentArray : [
    {
      childArray: [{value: 'v1'}, {value:'v2'}]
    }, 
    {
      childArray: [{value: 'v1'}, {value: 'v3'}]
    }
  ]
}
现在我想从
childArray
中选择不同的元素,它应该返回一个等于['v1','v2','v3']的数组

我有一些解决办法。我的第一个想法是继续使用
UNNEST
操作:

SELECT DISTINCT ca.value FROM `my-bucket` AS b UNNEST b.parentArray AS pa UNNEST pa.childArray AS ca WHERE _class="someclass" AND dataType="someDataType";
通过这种方法,我得到了扫描元素数量的多项式爆炸(由于未检测两个数组),并且查询需要一些时间来完成(对于我的实际数据,大约24秒)。当我删除unnest,并简单地查询顶级元素(与parentArray相邻的元素)上的不同元素时,它将以毫秒为单位

另一个解决方案是在应用程序代码中处理这个问题,只需迭代返回的值,然后自己查找不同的值。这种方法很糟糕,因为它将太多的数据带入了应用程序空间

请帮忙

谢谢大家!

更新:看起来如果没有使用“UNNEST”语句的“WHERE”子句,性能会很快。那么这里需要数组索引吗

UPDATE:不要担心上一次的更新,因为where子句中没有索引元素。还有,但是我注意到,如果我删除了UNNEST或WHERE,那么查询就会很快。此外,查看explain并为复合索引添加GSI(_类,数据类型),我可以在提供的索引上看到“IndexScan”

INSERT INTO default values("3",{ "parentArray" : [ { "childArray": [{"value": 'v1'}, {"value":'v2'}] }, { "childArray": [{"value": 'v1'}, {"value": 'v3'}] } ] });

SELECT ARRAY_DISTINCT(ARRAY v.`value` FOR v WITHIN parentArray END) FROM default;

您可以添加where子句。如果需要跨文档执行此操作,请使用以下命令

INSERT INTO default values("4",{ "parentArray" : [ { "childArray": [{"value": 'v5'}, {"value":'v2'}] }, { "childArray": [{"value": 'v1'}, {"value": 'v3'}] } ] });
SELECT ARRAY_DISTINCT(ARRAY_FLATTEN(ARRAY_AGG(ARRAY v.`value` FOR v WITHIN parentArray END),2)) FROM default;
SELECT ARRAY_DISTINCT(ARRAY_FLATTEN(ARRAY_AGG(ARRAY_FLATTEN(ARRAY ARRAY v.`value` FOR v IN ca.childArray END FOR ca IN parentArray END,2)),2)) FROM default;

您可以添加where子句。如果需要跨文档执行此操作,请使用以下命令

INSERT INTO default values("4",{ "parentArray" : [ { "childArray": [{"value": 'v5'}, {"value":'v2'}] }, { "childArray": [{"value": 'v1'}, {"value": 'v3'}] } ] });
SELECT ARRAY_DISTINCT(ARRAY_FLATTEN(ARRAY_AGG(ARRAY v.`value` FOR v WITHIN parentArray END),2)) FROM default;
SELECT ARRAY_DISTINCT(ARRAY_FLATTEN(ARRAY_AGG(ARRAY_FLATTEN(ARRAY ARRAY v.`value` FOR v IN ca.childArray END FOR ca IN parentArray END,2)),2)) FROM default;

这正是我最终要做的。我投了赞成票,谢谢。这正是我最终选择的。向上投票,谢谢。