我在祖先查询方面遇到了很大的困难。
以下是有效的代码:
...
uk := datastore.NewKey(c, config.DatastoreDuelIdKind, did, 0, nil)
_, err := datastore.NewQuery(config.DatastoreQuestionInDuelKind).Ancestor(uk).GetAll(c, &roundsPlayedInDuel)
...
上述代码会产生正确的结果。现在,如果我在 config.DatastoreQuestionInDuelKind 的属性上添加订单过滤器,则查询将失败,并显示NEED_INDEX错误。
但是这个失败了:
_, err := datastore.NewQuery(config.DatastoreQuestionInDuelKind).Order("RoundNumber").Ancestor(uk).GetAll(c, &roundsPlayedInDuel)
唯一的区别是添加了订单过滤器。
现在,我在index.yaml中定义了一个索引,如下所示:
索引:
- kind: gcx_Round_Id_Duel_Id
properties:
- name: DId
- name: RoundNumber
从App Engine仪表板我可以看到它正在服务。仍然得到索引错误。有什么想法吗?
答案 0 :(得分:2)
您的索引缺少'祖先'属性,而您的查询似乎没有使用'DId',因此无需包含该内容:
- kind: gcx_Round_Id_Duel_Id
ancestor: yes
properties:
- name: RoundNumber
您必须显式定义此索引,因为您将祖先查询与排序组合在一起 - 自动索引将允许您单独执行其中任何一个。 (因此,鉴于您正在获取所有实体,放弃查询排序然后使用代码对返回的实体进行排序可能会更有效。)