使用 Run 方法和 Query 值遍历查询结果时,Datastore 会对结果进行批量检索。默认情况下,每批包含 20 个结果。您可以持续遍历查询结果,直到返回所有结果或者请求超时。
如需遍历与查询匹配的每个实体,请使用 Run 方法获取 Iterator;借助 Iterator 的 Next 方法,可以对每个实体进行逐个检索。
q:=datastore.NewQuery("Person")t:=q.Run(ctx)for{varpPersonk,err:=t.Next(&p)iferr==datastore.Done{break// No further entities match the query.}iferr!=nil{log.Errorf(ctx,"fetching next Person: %v",err)break}// Do something with Person p and Key kdoSomething(k,p)}
q:=datastore.NewQuery("Person")varpeople[]Personkeys,err:=q.GetAll(ctx,&people)iferr!=nil{log.Errorf(ctx,"fetching people: %v",err)return}fori,p:=rangepeople{k:=keys[i]// Do something with Person p and Key kdoSomething(k,p)}
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["很难理解","hardToUnderstand","thumb-down"],["信息或示例代码不正确","incorrectInformationOrSampleCode","thumb-down"],["没有我需要的信息/示例","missingTheInformationSamplesINeed","thumb-down"],["翻译问题","translationIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2025-09-04。"],[[["\u003cp\u003eThis API is designed for first-generation runtimes, with a migration guide available for upgrading to App Engine Go 1.12+ second-generation runtimes.\u003c/p\u003e\n"],["\u003cp\u003eQuery results can be iterated through using the \u003ccode\u003eRun\u003c/code\u003e method, which retrieves results in batches, or retrieved all at once with the \u003ccode\u003eGetAll\u003c/code\u003e method.\u003c/p\u003e\n"],["\u003cp\u003eProjection queries allow for the retrieval of selected properties from an entity, which is faster and more cost-effective than retrieving full entities.\u003c/p\u003e\n"],["\u003cp\u003eKeys-only queries, created by calling the \u003ccode\u003eKeysOnly\u003c/code\u003e method, save resources by only returning the keys of matching entities.\u003c/p\u003e\n"],["\u003cp\u003eYou can limit the number of results returned by a query in a single batch by specifying a limit using the \u003ccode\u003eLimit\u003c/code\u003e method.\u003c/p\u003e\n"]]],[],null,["# Retrieving query results\n\n| This API is supported for first-generation runtimes and can be used when [upgrading to corresponding second-generation runtimes](/appengine/docs/standard/\n| go\n| /services/access). If you are updating to the App Engine Go 1.12+ runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/go-differences) to learn about your migration options for legacy bundled services.\n\nAfter constructing a query, you can specify a number of retrieval options to\nfurther control the results it returns.\nSee [datastore queries](/appengine/docs/legacy/standard/go111/datastore/queries) for more information on structuring queries for your app.\n\nIterating through query results\n-------------------------------\n\nWhen iterating through the results of a query using the [`Run`](/appengine/docs/legacy/standard/go111/datastore/reference#Query.Run) method of a [`Query`](/appengine/docs/legacy/standard/go111/datastore/reference#Query) value, Cloud Datastore retrieves the results in batches. By default each batch contains 20 results. You can continue iterating through query results until all are returned or the request times out.\nTo iterate over each entity that matches your query, use the [`Run`](/appengine/docs/legacy/standard/go111/datastore/reference#Query.Run) method to obtain an [`Iterator`](/appengine/docs/legacy/standard/go111/datastore/reference#Iterator), with which you can step through each entity using the `Iterator`'s [`Next`](/appengine/docs/legacy/standard/go111/datastore/reference#Iterator.Next) method.\n\n\u003cbr /\u003e\n\n q := datastore.NewQuery(\"Person\")\n t := q.Run(ctx)\n for {\n \tvar p Person\n \tk, err := t.Next(&p)\n \tif err == datastore.Done {\n \t\tbreak // No further entities match the query.\n \t}\n \tif err != nil {\n \t\tlog.Errorf(ctx, \"fetching next Person: %v\", err)\n \t\tbreak\n \t}\n \t// Do something with Person p and Key k\n \tdoSomething(k, p)\n }\n\nTo retrieve all entities matching your query at once, use the [`GetAll`](/appengine/docs/legacy/standard/go111/datastore/reference#Query.GetAll) method. \n\n q := datastore.NewQuery(\"Person\")\n var people []Person\n keys, err := q.GetAll(ctx, &people)\n if err != nil {\n \tlog.Errorf(ctx, \"fetching people: %v\", err)\n \treturn\n }\n for i, p := range people {\n \tk := keys[i]\n \t// Do something with Person p and Key k\n \tdoSomething(k, p)\n }\n\nRetrieving selected properties from an entity\n---------------------------------------------\n\nTo retrieve only selected properties of an entity rather than the entire entity, use a [*projection query*](/appengine/docs/legacy/standard/go111/datastore/projectionqueries). This type of query runs faster and costs less than one that returns complete entities.\n\nSimilarly, a [*keys-only query*](/appengine/docs/legacy/standard/go111/datastore/queries#keys-only_queries) saves time and resources by returning just the keys to the entities it matches, rather than the full entities themselves. To create this type of query, call the `KeysOnly` method when constructing the `Query`.: \n\n q := datastore.NewQuery(\"Person\").KeysOnly()\n\nSetting a limit for your query\n------------------------------\n\nYou can specify a *limit* for your query to control the maximum number of results returned in one batch. The following example retrieves the five tallest people from Cloud Datastore: \n\n q := datastore.NewQuery(\"Person\").Order(\"-Height\").Limit(5)\n var people []Person\n _, err := q.GetAll(ctx, &people)\n // check err\n\n for _, p := range people {\n \tlog.Infof(ctx, \"%s %s, %d inches tall\", p.FirstName, p.LastName, p.Height)\n }\n\nWhat's next?\n------------\n\n- Learn the [common restrictions](/appengine/docs/legacy/standard/go111/datastore/query-restrictions) for queries on Cloud Datastore.\n- Learn about [query cursors](/appengine/docs/legacy/standard/go111/datastore/query-cursors), which allow an application to retrieve a query's results in convenient batches.\n- [Understand data consistency](/appengine/docs/legacy/standard/go111/datastore/data-consistency) and how data consistency works with different types of queries on Cloud Datastore.\n- Learn the [basic syntax and structure of queries](/appengine/docs/legacy/standard/go111/datastore/queries) for Cloud Datastore."]]