Google App Engine 数据存储 returns 如果我有 Order 子句则没有行

Google App Engine Datastore returns no rows if i have an Order clause

我在数据存储中有一个 'kind',如下所示:

type CompanyDS struct {
    Name string
}

如果我用下面的 'order' 子句查询它,它 returns 没有行(但没有给出任何错误):

var companiesDS []CompanyDS
datastore.NewQuery("Company").Order("Name").GetAll(c, &companiesDS)

但是,如果我删除 'order("Name")' 部分,它 returns 所有行都很好。

我必须在 google 云平台控制台中编辑我的实体,并勾选名称字段中的方框 'Index this property'。

因为没有 Order() 你可以查询所有实体,这意味着它们确实存在名称 "Company" 和 属性 "Name".

单个属性的索引是自动创建的,因此您不需要为它们指定显式索引。

但是,如果您无法使用 Order("Name") 之类的单个 属性 顺序列出它们,则意味着您现有的实体未使用 Name 属性 编制索引.请注意,每个实体的索引可能不同。当您将一个实体保存(放入)到数据存储中时,您可以指定哪些属性要编制索引,哪些不编制索引。

您可以在 Google Cloud Platform Datastore 控制台上确认:执行查询

select * from Company

然后单击任何结果(其 ID),然后您将看到该实体的详细信息,列出哪些 属性 已编入索引,哪些未编入索引。

修复:

您可以在控制台上编辑实体:单击 "Name" 属性,然后在保存之前选中 "Index this property"。这将重新保存该实体,使其 Name 编入索引,因此它将显示在下一个查询中(按 Name 排序)。

您不需要为所有实体手动执行此操作。使用您的 Go 查询代码(没有 Order()),查询所有实体,然后不加修改地重新保存所有实体,因此 Name 将因此得到索引(因为您的 CompanyDS不会关闭 Name 属性 的索引)。确保你的结构包含所有属性,否则你会在重新保存时丢失它们。

注意:您应该确保保存 Company 个实体的代码使用 Name 索引保存它们。

例如,在 Go 中,值为 ",noindex"struct tag 将禁用单个 属性 的索引,如本例所示:

type CompanyDS struct {
    Name string `datastore:",noindex"`
}