如果我有一个Order子句,Google App Engine数据存储区不会返回任何行

时间:2017-11-23 02:08:30

标签: google-app-engine go google-cloud-datastore

我在数据存储区中有'亲切',如此:

type CompanyDS struct {
    Name string
}

如果我使用下面的'order'子句查询它,它将不返回任何行(但不会给出任何错误):

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

但是,如果我删除'order(“Name”)'部分,它会返回所有行。

2 个答案:

答案 0 :(得分:3)

我必须在Google云平台控制台中编辑我的实体,并在“名称”字段中勾选“索引此属性”框。

答案 1 :(得分:2)

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

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

但是如果你不能使用像Order("Name")这样的单个属性排序来列出它们,那就意味着你的现有实体没有使用Name属性编制索引。请注意,每个实体的索引可能不同。将实体保存(放入)数据存储区时,您可以指定要索引哪些属性以及哪些属性不是。

您可以在Google Cloud Platform数据存储控制台上进行确认:执行查询

select * from Company

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

修正:

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

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

注意:您应该确保保存Company个实体的代码会将Name索引保存起来。

在Go中,例如值为",noindex"的{​​{3}}将禁用单个属性的索引,如下例所示:

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