現在、3つのインデックスがあります。ユーザー、投票、機能。
機能には「アクティブな」ブールプロパティがあります。投票には2つのプロパティがあり、どちらもインデックスが付けられています。ユーザーのキーと機能のキー。
私がやろうとしているのは、現在アクティブな機能に対してユーザーが行ったすべての投票を取得することです。現在、すべてのアクティブな機能を取得しています。次に、結果の機能ごとに、現在のユーザーのIDと機能のIDに基づいて投票をフィルタリングします。
それはたくさんの質問です。
OR、JOIN、またはINを使用して単一のクエリを作成することを提案する人もいますが、GQLにはORまたはJOINがなく、INは配列では機能しないようです。
私が現在行っていることよりもうまく処理することは可能ですか?どうやって?
を使用できますBatch operations
。
以下は、特定のユーザーに関連するすべてのアクティブな機能を取得するための私の提案です。
注意
- クエリコストを最小化するために、以下のコードはを使用し
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.
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加