在Google Cloud数据存储区中的多个实体之间运行查询

时间:2017-08-30 09:38:30

标签: google-cloud-datastore

我目前有三个索引。用户,投票,功能。

功能具有'active'布尔属性。 投票有两个属性,都是索引;用户的密钥和功能密钥。

我要做的是获取用户对当前活动功能所做的所有投票。目前,我正在获取所有活动功能,然后对于每个结果功能,我根据当前用户的ID和功能的ID过滤投票。

这是很多疑问。

有些人建议我使用OR,JOIN或IN进行单个查询,但看起来GQL没有OR或JOIN,并且它的IN不适用于数组。

是否有可能比我目前正在做的更好地处理它?怎么样?

1 个答案:

答案 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.
        }
    }