2016-11-16 96 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