GAE数据存储区(Golang):添加新数据库字段时的筛选查询

时间:2016-08-23 14:43:51

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

我正在运行与datastore一起使用的GAE Golang应用程序。我有一个结构转换为datastore上的数据库模型,我在结构中添加了一个新字段,称之为NewField(类型string

此结构的现有实例(数据库中的“行”)当然缺少此NewField,这是预期的。

我正在寻找创建一个查询,该查询将返回缺少此NewField的所有实例(现有实例)。

这就是我的尝试:

q := datastore.NewQuery("MyModel")
q = q.Filter("NewField =", "")

然而,这似乎不起作用。

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:2)

坏消息是你做不到。

GAE数据存储区上的每个查询都在索引上运行。由于您刚刚添加了新属性,因此没有该属性的现有实体将不在任何索引中(包括该属性)。你需要的是循环没有索引记录的实体 ,但这是不可能的。

最好的办法是查询所有实体,并在Go代码中手动进行过滤/更新,其中NewField字段的值为零。重新保存现有实体后,新属性将被编入索引,您将来可以通过该属性进行搜索/过滤。

如果您的实体有任何机会存储创建时间或上次更新时间(在属性中),那么您可以使用:按上次更新时间过滤,仅列出时间戳小于添加时间的实体Go模型的新属性。

另一个选项(用于将来的更改)是向您的实体添加"version"属性。每当执行模型更新时,请增加新实体的版本。并且您始终可以使用旧版本(或特定版本)查询实体。