Récupérer des résultats de requête

Une fois que vous avez créé une requête, vous pouvez spécifier un certain nombre d'options de récupération de façon à mieux contrôler les résultats qu'elle renvoie. Pour en savoir plus sur la structuration des requêtes pour votre application, consultez la page Requêtes Datastore.

Appliquer une itération aux résultats de la requête

Lors d'une itération sur les résultats d'une requête à l'aide de la méthode Run d'une valeur Query, Cloud Datastore récupère les résultats sous forme de lots. Par défaut, chaque lot contient 20 résultats. Vous pouvez continuer à appliquer l'itération aux résultats de la requête jusqu'à ce que tous les résultats soient renvoyés ou jusqu'à l'expiration de la requête.

Pour procéder à l'itération sur chaque entité correspondant à la requête, exécutez la méthode Run pour obtenir un élément Iterator. La méthode Next de l'élément Iterator vous permet de parcourir chaque entité.

q := datastore.NewQuery("Person")
t := q.Run(ctx)
for {
	var p Person
	k, err := t.Next(&p)
	if err == datastore.Done {
		break // No further entities match the query.
	}
	if err != nil {
		log.Errorf(ctx, "fetching next Person: %v", err)
		break
	}
	// Do something with Person p and Key k
	doSomething(k, p)
}

Pour récupérer toutes les entités correspondant à la requête en même temps, faites appel à la méthode GetAll.

q := datastore.NewQuery("Person")
var people []Person
keys, err := q.GetAll(ctx, &people)
if err != nil {
	log.Errorf(ctx, "fetching people: %v", err)
	return
}
for i, p := range people {
	k := keys[i]
	// Do something with Person p and Key k
	doSomething(k, p)
}

Récupérer certaines propriétés d'une entité

Pour ne récupérer que certaines propriétés d'une entité plutôt que l'entité entière, utilisez une requête de projection. Ce type de requête s'exécute plus rapidement et coûte moins cher qu'une requête renvoyant des entités entières.

De même, une requête ne contenant que des clés permet de gagner du temps et d'économiser des ressources en ne renvoyant que les clés associées aux entités auxquelles elle correspond, plutôt que les entités entières elles-mêmes. Pour créer ce type de requête, appelez la méthode KeysOnly lors de la construction de la valeur Query :

q := datastore.NewQuery("Person").KeysOnly()

Définir une limite pour la requête

Vous pouvez spécifier une limite pour la requête afin de contrôler le nombre maximal de résultats renvoyés dans un lot. L'exemple suivant récupère les cinq personnes les plus grandes depuis Cloud Datastore :

q := datastore.NewQuery("Person").Order("-Height").Limit(5)
var people []Person
_, err := q.GetAll(ctx, &people)
// check err

for _, p := range people {
	log.Infof(ctx, "%s %s, %d inches tall", p.FirstName, p.LastName, p.Height)
}

Étape suivante