我目前有三个索引。用户,投票,功能。
功能具有'active'布尔属性。 投票有两个属性,都是索引;用户的密钥和功能密钥。
我要做的是获取用户对当前活动功能所做的所有投票。目前,我正在获取所有活动功能,然后对于每个结果功能,我根据当前用户的ID和功能的ID过滤投票。
这是很多疑问。
有些人建议我使用OR,JOIN或IN进行单个查询,但看起来GQL没有OR或JOIN,并且它的IN不适用于数组。
是否有可能比我目前正在做的更好地处理它?怎么样?
答案 0 :(得分:1)
您可以使用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.
}
}