2017-08-30 1 views
0

J'ai actuellement trois index. Utilisateurs, votes, fonctionnalités.Exécution d'une requête sur plusieurs entités dans le magasin de données Google Cloud

Les caractéristiques ont une propriété booléenne 'active'. Les votes ont deux propriétés, les deux indexées; la clé de l'utilisateur et la clé de la fonctionnalité.

Ce que j'essaie de faire est d'obtenir tous les votes que l'utilisateur a fait sur les fonctionnalités actuellement actives. Actuellement, je reçois toutes les fonctionnalités actives, puis pour chaque fonctionnalité résultante, je filtre les votes en fonction de l'identifiant de l'utilisateur actuel et de l'identifiant de la fonctionnalité.

Cela fait beaucoup de requêtes.

Certaines personnes ont suggéré que je fasse une seule requête en utilisant OU, ou JOIN, ou IN, mais il semble que GQL n'ait pas OR ou JOIN, et que ce soit IN ne fonctionne pas avec les tableaux.

Est-il possible de le gérer mieux que ce que je suis en train de faire? Comment?

Répondre

1

Vous pouvez utiliser Batch operations.

Ci-dessous est ma suggestion pour obtenir toutes les fonctionnalités actives liées à un utilisateur spécifique.

Remarque

  • Pour minimaize le coût de la requête, au-dessous des codes utilise Keys-only queries. Et il est supposé que la clé Votes est comme ceci: {user_id}_{feature_id}.
  • Ci-dessous les codes indicatifs de Golang.

1) obtenir des votes liés à l'utilisateur spécifique Keys-only query (Il est préférable d'ajouter la limite pour le coût):

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

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

2) Get FeatureID par panachage clé de:

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) Obtenir des fonctionnalités par Batch operation:

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

4) Caractéristiques Filtrer par pavillon actif:

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

Désolé pour la réponse tardive. Cela semble malheureusement être la meilleure façon de le faire pour l'instant. – ElFitz