0

我有一个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")

返回所有条目,以及从未按预期设置UnlistedUnviewable将其设置为零值的条目。缺点是文章内容被不必要地传递。

在这种情况下,这种妥协并不可怕,但我预计将来会出现类似的情况,并且不能使用投影查询可能是一件大事。投影查询和向数据存储条目添加新属性似乎不能很好地结合在一起。我想确保我没有误解某事或错过正确的做事方式。

  1. 从文档中我不清楚投影查询应该以这种方式运行(忽略不具有投影属性的条目,而不是将它们包含为零值)。这是预期的行为吗?

  2. 在这样的场景中是唯一的选择(将新字段添加到结构/属性到条目)要么放弃投影查询或运行某种“模式迁移”,Get然后将所有条目Put返回,因此它们现在具有零值属性和可以预测?

4

1 回答 1

1

投影查询从索引而不是实体中获取字段的数据,当您添加新属性时,预先存在的记录不会出现在您正在执行项目查询的那些索引中。他们将需要重新索引。

您正在要求那些特定的属性,它们不存在因此当前的行为。

除了您在查询中放置的任何过滤器之外,您可能应该将投影查询视为对请求索引中具有值的实体的请求。

于 2013-08-10T01:51:10.143 回答