擷取查詢結果

建構查詢後,您可以指定多個擷取選項,進一步控制傳回的結果。如要進一步瞭解如何建構應用程式的查詢,請參閱「資料儲存庫查詢」一文。

疊代查詢結果

使用 Query 值的 Run 方法迭代查詢結果時,Cloud Datastore 會分批擷取結果。根據預設,每個批次會包含 20 個結果。您可以繼續反覆查詢查詢結果,直到傳回所有結果或是要求逾時為止。

如要逐一檢查符合查詢的每個實體,請使用 Run 方法取得 Iterator,然後使用 IteratorNext 方法逐一檢查每個實體。

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)
}

如要一次擷取符合查詢的所有實體,請使用 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)
}

從實體上擷取所選的屬性

如果只要擷取實體的部分屬性 (而非整個實體),請使用投影查詢。相較於傳回完整的實體,這類查詢執行速度較快,費用也較低。

同樣的,純索引鍵查詢可以只傳回相符實體的索引鍵,而非整個實體,藉此節省時間和資源。如要建立這類查詢,請在建構 Query 時呼叫 KeysOnly 方法:

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

設定查詢限制

您可以指定查詢的「限制」,以此控管一批次傳回的結果上限數量。下列範例會從 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)
}

後續步驟