GAE Datastore (Golang):添加新数据库字段时过滤查询

GAE Datastore (Golang): Filter Query When Adding New DB Field

我是 运行 一个使用 datastore 的 GAE Golang 应用程序。我有一个转换为 datastore 上的数据库模型的结构,我向该结构添加了一个新字段,将其命名为 NewField(类型 string

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

我希望创建一个查询,该查询将 return 所有缺少此 NewField 的实例(现有实例)。

这是我试过的:

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

但这似乎不起作用。

关于如何实现这一点有什么想法吗?

坏消息是你做不到。

GAE Datastore 上的每个查询都对索引进行操作。由于您刚刚添加了新的 属性,没有 属性 的现有实体将不会出现在任何索引中(包括 属性)。您需要的是遍历没有索引记录的实体,但这是不可能的。

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

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

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