使用新字段/专有信息的投影查询会忽略尚未设置这些属性的条目

时间:2013-08-10 00:56:17

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

我的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进入数据存储区时返回明确包含UnviewablePut的条目。

我现在的解决方法是停止使用投影查询:

q := datastore.NewQuery("Article")

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

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

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

  2. 这样的场景中的唯一选项(向结构/属性添加新的字段到条目)要么放弃投影查询,要么运行某种“模式迁移”,Get ting所有条目然后Put让他们回来,所以他们现在有零价值的属性并可以投射?

1 个答案:

答案 0 :(得分:1)

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

您要求提供这些特定属性,因此不存在当前行为。

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