我正在运行与datastore
一起工作的GAE Golang应用程序。我有一个结构体转换为datastore
上的DB模型,并且我在结构体中添加了一个新字段,称为NewField
(类型string
)
该结构体的现有实例(DB中的"行")当然缺少NewField
,这是预期的。
我正在寻找创建一个查询,将返回所有实例,其中这个NewField
是缺失的(现有的实例)。
这是我尝试过的:
q := datastore.NewQuery("MyModel")
q = q.Filter("NewField =", "")
然而,这似乎不起作用。
对如何实现这一点有什么想法吗?
坏消息是你不能。
GAE Datastore上的每个查询都在索引上操作。由于您刚刚添加了新属性,没有该属性的现有实体将不会出现在任何索引(包括该属性)中。您需要的是遍历没有索引记录的实体,但这是不可能的。
您最好的选择是查询所有实体,并在Go代码中手动执行过滤/更新,其中NewField
字段具有零值。一旦您重新保存现有的实体,新的属性将被索引,并且您将能够在将来通过该属性进行搜索/过滤。
如果你的实体碰巧存储了创建时间或最后更新时间(在属性中),那么你可以使用:filter by last updated time来列出时间戳小于你将新属性添加到Go模型的时间的实体。
另一个选项(用于将来的更改)是向实体添加"version"
属性。无论何时执行模型更新,都要增加新实体的版本。并且,您始终可以查询旧版本(或特定版本)的实体。