如何重命名数据存储实体字段,但能够通过旧的和新的属性名称检索记录?
我有一个实体如何重命名数据存储实体字段,但能够通过旧的和新的属性名称检索记录?
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");
只撷取自重命名已保存的实体。任何较旧的实体都被忽略。
什么是重命名实体字段的最佳做法,以便我可以有一个将返回所有记录的单个查询?
回答:
注意:我不是一个客观化的用户,答案是通用的,所以你必须适应物化的细节。
一般要避免同时使用bar
和somethingElse
为长时间,主要是因为寻找匹配实体转化为OR
类型的查询 - .filter("bar", "someValue")
OR.filter("somethingElse", "someValue")
,这是由数据存储不支持的根本。从Restrictions on queries:
的
NOT
,OR
和!=
运营商本身不支持, 但有些客户端库可以在云存储上添加支持。
这意味着,在最好的,你必须跳火圈,使这样的工作,例如见,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
所有索引服务于所有非查询的地方 - ,然后换你的查询从
bar
到somethingElse
。有了这个实际的迁移已完成,您可以执行以下 - 降清理步骤写
bar
财产 - 执行查询对具有
bar
属性的所有entitites并把它们重新写不bar
。请注意,这可能比真正从模型和指标让这些实体单独 - 下降
bar
(如果适用于您的客户端库)更贵,但只有当你在上一步中删除了所有的实体财产
此方法的迁移可以缓慢执行,因为它不需要完全关闭服务,因此可以通过live进行迁移。
以上是 如何重命名数据存储实体字段,但能够通过旧的和新的属性名称检索记录? 的全部内容, 来源链接: utcz.com/qa/259742.html