如何重命名数据存储实体字段,但能够通过旧的和新的属性名称检索记录?

我有一个实体如何重命名数据存储实体字段,但能够通过旧的和新的属性名称检索记录?

class Foo { 

public String bar;

}

我想重命名 “酒吧” 到 “somethingElse”。并计划使用Objectify的@AlsoLoad注解来实现这一点(我已经在使用Objectify进行持久化)。因此,像:

class Foo { 

@AlsoLoad("bar")

public String somethingElse;

}

但形式有任何疑问:

final Query<Foo> query = OfyService.ofy().load().type(Foo.class) 

.filter("somethingElse", "someValue");

只撷取自重命名已保存的实体。任何较旧的实体都被忽略。

什么是重命名实体字段的最佳做法,以便我可以有一个将返回所有记录的单个查询?

回答:

注意:我不是一个客观化的用户,答案是通用的,所以你必须适应物化的细节。

一般要避免同时使用barsomethingElse为长时间,主要是因为寻找匹配实体转化为OR类型的查询 - .filter("bar", "someValue")OR.filter("somethingElse", "someValue"),这是由数据存储不支持的根本。从Restrictions on queries:

NOTOR!=运营商本身不支持, 但有些客户端库可以在云存储上添加支持。

这意味着,在最好的,你必须跳火圈,使这样的工作,例如见,Google Datastore combine (union) multiple sets of entity results to achieve OR condition

我的建议是进行一次性迁移,并用它完成。这将包括以下步骤:

  • 最有可能的,你必须有在迁移过程中性能配置/活着,所以不只是重命名bar,而不是添加somethingElse不要立即删除bar
  • 在所有的地方,你更新bar属性还更新somethingElse相应
  • 添加逻辑来查询具有bar但没有somethingElse并把它们重新写那么他们也有所有实体3210。这一步完成后,所有的实体应该有一个somethingElse镜像bar在你读bar的价值交换阅读somethingElse代替
  • 检查含somethingElse所有索引服务于所有非查询的地方
  • ,然后换你的查询从barsomethingElse。有了这个实际的迁移已完成,您可以执行以下
  • 降清理步骤写bar财产
  • 执行查询对具有bar属性的所有entitites并把它们重新写不bar。请注意,这可能比真正从模型和指标让这些实体单独
  • 下降bar(如果适用于您的客户端库)更贵,但只有当你在上一步中删除了所有的实体财产

此方法的迁移可以缓慢执行,因为它不需要完全关闭服务,因此可以通过live进行迁移。

以上是 如何重命名数据存储实体字段,但能够通过旧的和新的属性名称检索记录? 的全部内容, 来源链接: utcz.com/qa/259742.html

回到顶部