Azure Cosmos DBのSQLサブクエリの書き方を見てみましょう。
例えば、次のようなクエリを表現したい場合はどうすればいいでしょうか。
SELECT Count(1) AS Count
FROM c
JOIN t IN c.tags
JOIN n IN c.nutrients
JOIN s IN c.servings
WHERE
t.name = ‘infant formula’
AND (n.nutritionValue > 0 AND n.nutritionValue < 10)
AND s.amount > 1
このクエリでは、インデックスは、タグの名前に「infant formula」を持つDocumentと一致します。
nutritionValue が0から10で、amaoutが1より大きいものです。
ここでのJOIN式は、フィルターを適用する前に、マッチしたtag、nutrients、servings配列を外積します。
Where句は、「c,t,n,s」タプルにフィルターを適用します。
マッチするDocumentが、tag、nutrients、servingsにそれぞれ10個あるとすると、10×10×10の1000個に拡張し、それに対してフィルターを書けます。
結合する前にフィルターをかけて効率化するにはサブクエリを利用します。
SELECT Count(1) AS Count
FROM c
JOIN (SELECT VALUE t FROM t IN c.tags WHERE t.name = ‘infant formula’)
JOIN (SELECT VALUE n FROM n IN c.nutrients WHERE n.nutritionValue > 0 AND n.nutritionValue < 10)
JOIN (SELECT VALUE s FROM s IN c.servings WHERE s.amount > 1)
タグが1つ、nutritionValue とservings が5つフィルターされたとすると、JSON式は25項目を展開します。