我正在运行与datastore
一起使用的GAE Golang应用程序。我有一个结构转换为datastore
上的数据库模型,我在结构中添加了一个新字段,称之为NewField
(类型string
)
此结构的现有实例(数据库中的“行”)当然缺少此NewField
,这是预期的。
我正在寻找创建一个查询,该查询将返回缺少此NewField
的所有实例(现有实例)。
这就是我的尝试:
q := datastore.NewQuery("MyModel")
q = q.Filter("NewField =", "")
然而,这似乎不起作用。
关于如何实现这一目标的任何想法?
答案 0 :(得分:2)
坏消息是你做不到。
GAE数据存储区上的每个查询都在索引上运行。由于您刚刚添加了新属性,因此没有该属性的现有实体将不在任何索引中(包括该属性)。你需要的是循环没有索引记录的实体 ,但这是不可能的。
最好的办法是查询所有实体,并在Go代码中手动进行过滤/更新,其中NewField
字段的值为零。重新保存现有实体后,新属性将被编入索引,您将来可以通过该属性进行搜索/过滤。
如果您的实体有任何机会存储创建时间或上次更新时间(在属性中),那么您可以使用:按上次更新时间过滤,仅列出时间戳小于添加时间的实体Go模型的新属性。
另一个选项(用于将来的更改)是向您的实体添加"version"
属性。每当执行模型更新时,请增加新实体的版本。并且您始终可以使用旧版本(或特定版本)查询实体。