Couchbase N1QL查询数组_包含速度

Couchbase N1QL查询数组_包含速度,couchbase,n1ql,Couchbase,N1ql,我有以下表格的文件需要查询: { "id": "-KWiJ1LlYbXSSRUmocwK", "ownerID": "72f16d9d-b905-498c-a7ff-9702cdcae996", "orgID": "20071513", "teams": [ "5818f7a75f84c800079186a8", "5818cbb25f84c800079186a7" ] } 我希望能够基于ownerID和teams数组进行查询。我的查询当前看起来是这样的:

我有以下表格的文件需要查询:

{
  "id": "-KWiJ1LlYbXSSRUmocwK",
  "ownerID": "72f16d9d-b905-498c-a7ff-9702cdcae996",
  "orgID": "20071513",
  "teams": [
    "5818f7a75f84c800079186a8",
    "5818cbb25f84c800079186a7"
  ]
}
我希望能够基于ownerID和teams数组进行查询。我的查询当前看起来是这样的:

SELECT id FROM
default AS p 
WHERE p.ownerID = $1
OR ARRAY_CONTAINS(p.teams, $2)
ORDER BY id
因此,我可以获取具有预期ownerID的文档以及在teams数组中具有特定团队id的文档。这个查询确实有效,但当我有很多文档时,我担心性能,可能有些文档分配了多达20个团队

我走对了吗


编辑:Couchbase 4.1版引入了数组索引。这允许您为数组中的单个元素(在您的示例中为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;

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;

是的,我现在正在使用社区,所以我相信我暂时还停留在4.1上,但如果可能的话,我肯定会升级。另外,在对任何vs ARRAY_包含的地方(至少在4.1中)进行了一些测试之后,ARRAY_包含的内容似乎在速度上赢了一点。我发现了一个问题:必须使用相同的变量名(本例中为t)创建索引和选择索引。如果它们不匹配,查询可能会工作,但速度会慢得多,因为查询计划器不会使用索引(即使给定了使用索引)。是的,我现在正在使用社区,所以我相信我暂时还停留在4.1上,但如果可能的话,我肯定会升级。另外,在对任何vs ARRAY_包含的地方(至少在4.1中)进行了一些测试之后,ARRAY_CONTAINS似乎在速度上赢了一点。我发现了一个问题:必须使用相同的变量名(本例中为t)创建索引和选择。如果它们不匹配,查询可能会工作,但速度会慢得多,因为查询计划器不会使用索引(即使给定了使用索引)。