2016-11-16 47 views
0

我有以下形式的,我需要查询的文件:N1QL查询ARRAY_CONTAINS速度

{ 
    "id": "-KWiJ1LlYbXSSRUmocwK", 
    "ownerID": "72f16d9d-b905-498c-a7ff-9702cdcae996", 
    "orgID": "20071513", 
    "teams": [ 
    "5818f7a75f84c800079186a8", 
    "5818cbb25f84c800079186a7" 
    ] 
} 

我会希望能够基于OWNERID和团队阵列进行查询。我的查询目前看起来像这样:

SELECT id FROM 
default AS p 
WHERE p.ownerID = $1 
OR ARRAY_CONTAINS(p.teams, $2) 
ORDER BY id 

这样我就可以得到与预期有球队阵中的特定团队身份证件OWNERID以及文档。这个查询确实有效,但是当我拥有大量文档时,我担心性能问题,并且可能有些文档最多分配了20个小组。

我在正确的轨道上吗?

编辑:Couchbase ver 4.1

回答

1

Couchbase 4.5引入了数组索引。这允许您索引数组中的单个元素,在您的案例中为teams数组。这对于查询的性能至关重要。随着4.5.1或4.6,你会做什么:

CREATE INDEX idx_owner ON default(ownerID); 
CREATE INDEX idx_teams ON default(DISTINCT ARRAY t FOR t IN teams END); 

SELECT id 
FROM default AS p 
WHERE p.ownerID = $1 
UNION 
SELECT id 
FROM default AS p 
WHERE ANY t IN p.teams SATISFIES t = $2 END; 
+0

是的,我正在使用的社区,现在,所以我相信我卡在4.1暂时的,但我一定会尽可能升级。 – cozzbp

+0

同样在使用WHERE ANY和ARRAY_CONTAINS(至少在4.1)进行一些测试之后,ARRAY_CONTAINS似乎在速度上胜出一点。 – cozzbp

+0

我在这发现了一个问题:你*必须*在CREATE INDEX和SELECT中使用相同的变量名(t在这个例子中)。如果它们不匹配,查询可能会工作,但速度会更慢,因为查询规划器不会使用索引(即使给定了USE INDEX)。 – slinkp