2017-08-15 68 views
1

我有一個數據存儲區,其中一個屬性包含一個字符串數組。每個實體可以具有該陣列的不同大小。我想對每個實體中的數組內容進行查詢和過濾。如何基於使用Java庫的陣列屬性過濾Google Content Store數據

我目前生成一組過濾器,一個用於數組中的每個必需字符串。然後構建一個複合過濾器,用於EntityQuery。該過濾器是這樣產生的:

// 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()); 

然而,這將兩個實體與arrayProperty = [A,B,C]和匹配arrayProperty = [A,B,C,d]。

我可以使用com.google.cloud.datastore中JAVA庫中的Google Cloud Datastore Query過濾掉其屬性值是特定數組且具有完全相同元素(不多,不少於獨立順序)的實體嗎?也許通過某種尺寸過濾器或完全不同的查詢/過濾器。或者我可以使用GQL?

回答

1

您無法對數組屬性執行相等過濾器(或完全匹配)。您只能查詢包含一個或多個單獨元素的實體。從您的示例數據([a, b, c][a, b, c, d]),下面的查詢是可能的:

  • arrayProperty="a" - 返回兩個實體
  • arrayProperty="a" AND arrayProperty="b" - 返回兩個實體
  • arrayProperty="a" AND arrayProperty="b" AND arrayProperty="c" - 返回兩個實體
  • arrayProperty="a" AND arrayProperty="b" AND arrayProperty="c" AND arrayProperty="d" - 回報只是一個實體
  • arrayProperty='x' - 兩者都不匹配

您可以期待與查詢/篩選器和GQL具有相同的行爲。

One 解決方法是將數組屬性中的元素數存儲在單獨的字段中,然後在Count屬性和Array屬性上創建組合索引。然後將查詢可能是這樣的:

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

這將返回其arrayProperty恰好有3件和arrayProperty有一個,b和c以任何順序所有實體。

當創建/更新實體時,您還必須確保新的計數屬性保持同步。

雖然這應該會給你想要的結果,但你的索引尺寸會更大。

假設您的Array中的主數據是String類型,您也可以選擇將計數轉儲到原始數組字段中(作爲整數)。採用這種方法,您可以避免組合索引。

+0

謝謝!不是我希望的答案,但不能爲此責怪你! :-P –