2017-08-30 14 views
0

私は現在3つのインデックスを持っています。ユーザー、投票、機能Google Cloudデータストア内の複数のエンティティ間でクエリを実行

機能には、「アクティブな」ブール値プロパティがあります。 投票には2つのプロパティがあり、どちらもインデックスされます。ユーザーのキーと機能のキー。

私がやっていることは、ユーザーが現在アクティブな機能に対して行ったすべての投票を得ることです。現在、私はすべてのアクティブな機能を取得しています。次に、結果の各機能について、現在のユーザーのIDと機能のIDに基づいて投票をフィルタリングします。

これは多くのクエリです。

OR、JOIN、またはINを使用して1つのクエリを作成することを提案した人もいますが、GQLにはORまたはJOINはなく、INは配列では機能しません。

私が現在行っていることよりもそれを処理することは可能ですか?どうやって?

答えて

1

Batch operationsを使用できます。

以下は、特定のユーザーに関連するすべてのアクティブな機能を取得するためのものです。

コード以下のクエリコストは、Keys-only queriesを使用していますminimaizeへの注意

  • 。 そしてVotesのキーは{user_id}_{feature_id}のようになります。
  • 以下のコードはゴランのダミーコードです。

1)Keys-only queryすることによって、特定のユーザに関連投票(コストの制限を追加した方がよい)を取得します:投票のキーを分割することによりFEATUREID取得

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

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

2):

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

関連する問題