2017-08-30 37 views
0

我目前有三個索引。用戶,投票,功能。在谷歌雲數據存儲中的多個實體上運行查詢

特點有一個「積極的」布爾屬性。 投票有兩個屬性,都索引;用戶的密鑰和功能的密鑰。

我想要做的就是讓所有的用戶取得了對當前活動功能的選票。目前,我正在獲取所有活動功能,然後針對每個結果功能,根據當前用戶的ID和功能ID篩選選票。

這是一個很大的查詢。

有些人建議我使用OR或JOIN或IN進行單個查詢,但看起來GQL沒有OR或JOIN,並且它的IN不能用於數組。

是否可以處理它比目前我在做什麼好?怎麼樣?

回答

1

您可以使用Batch operations

下面是我suggesion獲得與特定用戶的所有活動功能。

  • 要minimaize查詢成本,下面的代碼使用Keys-only queries。 而且它應該是Votes的關鍵是這樣的:{user_id}_{feature_id}
  • 下面的代碼是Golang的虛擬代碼。

1)獲取Keys-only query與特定用戶投票(這是更好地增加限制成本):

query := datastore.NewQuery("Votes").Filter("UserID =", 123).KeysOnly().Limit(100) 

    keys, err := client.GetAll(ctx, query, nil) 

2)獲取FeatureID和通過分裂投票的關鍵:

featureIDs := make([]*datastore.Key, len(keys)) 

    for i, key := range keys { 
     s := strings.Split(key, "_") 
     userID, featureID := s[0], s[1] 
     featureIDs[i] = &datastore.Key{ Name:featureID } 
    } 

3)通過Batch operation獲取功能:

var features []*Features 
    client.GetMulti(ctx, featureIDs, features) 

4)過濾功能,通過主動標誌:

for _, f := range features { 
     if f.active { 
      // this is active feature. 
     } 
    } 
+0

對不起,我遲到的答案。可悲的是,現在似乎是最好的辦法。 – ElFitz