2017-08-15 10 views
1

1つのプロパティに文字列の配列が含まれているデータストアがあります。各エンティティは、その配列とは異なるサイズを持つことができます。私はクエリを作成し、各エンティティの配列の内容をフィルタリングする必要があります。Javaライブラリを使用して配列であるプロパティに基づいてGoogle Content Storeデータをフィルタリングする方法

現在、フィルタのセットを生成しています。これは、配列内の必要な文字列ごとに1つずつです。次に、EntityQueryで使用する複合フィルタを構築します。これはしかし、arrayProperty = [A、B、C]とarrayProperty = [A、B、C、D]の両方のエンティティに一致する

// arrayProperty is the name on the property in my Datastore that contains the array of strings. 
List<PropertyFilter> pathFilters = Arrays.stream(new String[] {"a","b","c"}) 
    .map(s -> PropertyFilter.eq("arrayProperty", s)) 
    .collect(Collectors.toList()); 

:フィルタは、このように生成されます。

com.google.cloud.datastoreのJAVAライブラリのGoogle Cloud Datastoreクエリを使用して、プロパティ値が全く同じ要素を持つ特定の配列を除外することができますか?たぶん、何らかのサイズのフィルターや完全に異なるクエリ/フィルターによって。あるいは、私はGQLを使うことができますか?

答えて

1

配列プロパティで等価フィルタ(または完全一致)を使用することはできません。 1つまたは複数の個々の要素を含むエンティティのみを照会できます。あなたの例のデータ([a, b, c][a, b, c, d])からは、以下のクエリが可能です。

  • arrayProperty="a" - エンティティ
  • arrayProperty="a" AND arrayProperty="b"の両方を返します - 両方のエンティティ
  • arrayProperty="a" AND arrayProperty="b" AND arrayProperty="c"を返す - 戻りちょうど1 - 両方のエンティティ
  • arrayProperty="a" AND arrayProperty="b" AND arrayProperty="c" AND arrayProperty="d"を返します。エンティティ
  • arrayProperty='x' - いずれも一致しません。

クエリ/フィルタとGQLで同じ動作が期待できます。

回避策は、Arrayプロパティの要素数を別のフィールドに格納し、CountプロパティとArrayプロパティで複合インデックスを作成します。これは、そのarrayProperty正確に3つの要素を持っており、arrayPropertyは、任意の順序で、a、b及びcを持っているすべてのエンティティを返します

WHERE count=3 AND arrayProperty="a" AND arrayProperty="b" AND arrayProperty="c" 

:次に、あなたのクエリのようなものである可能性があります。

また、エンティティの作成/更新時に新しいcountプロパティが同期していることを確認する必要があります。

これは望ましい結果をもたらすはずですが、インデックスのサイズはさらに大きくなります。

また、配列内の主データがString型であると仮定して、元の配列フィールドに(Integerとして)カウントをダンプすることもできます。この方法では、複合インデックスを避けることができます。

+0

ありがとうございます!私が望んでいた答えではありませんが、あなたの責任を責めることはできません! :-P –

関連する問題