【问题标题】:GAE Datastore (Golang): Filter Query When Adding New DB FieldGAE Datastore (Golang):添加新数据库字段时过滤查询
【发布时间】:2016-08-23 14:43:50
【问题描述】:

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

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

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

这是我尝试过的:

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

但是这似乎不起作用。

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

【问题讨论】:

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


    【解决方案1】:

    坏消息是你不能。

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

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

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

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

    【讨论】:

    • 感谢您的回答。就产品而言,代表数据存储有点蹩脚,但我会解决这个问题。
    • @orcaman 同意,这可能会让人头疼,但另一方面,这是为了确保所有查询都“超快”运行,无论您拥有多少实体。这是通过只允许由索引支持的查询来完成的。而这样的查询列出了缺少属性的实体,没有索引。
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多