我的Article
类型的结构如下:
type Article struct {
Title string
Content string `datastore:",noindex"`
}
在我网站的管理部分,我列出了所有文章。我需要显示此列表的唯一属性是Title
;抓住文章的内容似乎很浪费。所以我使用projection query:
q := datastore.NewQuery("Article").Project("Title")
到目前为止,一切都按预期工作。现在,我决定向Article
添加两个字段,以便某些文章可以在公共文章列表中不公开和/或在尝试访问时不可查看。理解数据存储是无模式的,我认为这可能非常简单。我将两个新字段添加到Article
:
type Article struct {
Title string
Content string `datastore:",noindex"`
Unlisted bool
Unviewable bool
}
我还将它们添加到投影查询中,因为我想在管理文章列表中指出文章公开不公开和/或不可查看时:
q := datastore.NewQuery("Article").Project("Title", "Unlisted", "Unviewable")
不幸的是,这只会在Unlisted
进入数据存储区时返回明确包含Unviewable
和Put
的条目。
我现在的解决方法是停止使用投影查询:
q := datastore.NewQuery("Article")
返回所有条目,从未设置Unlisted
或Unviewable
的条目将它们按预期设置为零值。缺点是文章内容不必要地传递。
在这种情况下,这种妥协并不可怕,但我预计未来会出现类似情况,并且无法使用投影查询可能是一件大事。投影查询和向数据存储条目添加新属性似乎不能很好地融合在一起。我想确保我不会误解某些事情或错过正确的做事方式。
从文档中我不清楚投影查询应该以这种方式运行(忽略没有投影属性的条目,而不是将它们包含在零值中)。这是预期的行为吗?
这样的场景中的唯一选项(向结构/属性添加新的字段到条目)要么放弃投影查询,要么运行某种“模式迁移”,Get
ting所有条目然后Put
让他们回来,所以他们现在有零价值的属性并可以投射?
答案 0 :(得分:1)
投影查询从索引而非实体中获取字段的数据,当您添加新属性时,预先存在的记录不会出现在您正在执行项目查询的索引中。它们需要重新编制索引。
您要求提供这些特定属性,因此不存在当前行为。
除了您在查询中放置的任何过滤器之外,您可能应该将投影查询视为对请求索引中具有值的实体的请求。