我有一个Article
这样的类型:
type Article struct {
Title string
Content string `datastore:",noindex"`
}
在我网站的管理部分,我列出了我所有的文章。为了显示此列表,我需要的唯一属性是Title
;抓取文章的内容似乎很浪费。所以我使用投影查询:
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
然后将所有条目Put
返回,因此它们现在具有零值属性和可以预测?