如何更改NDB记录的祖先?

时间:2012-08-07 21:04:55

标签: python google-app-engine google-cloud-datastore

在High-Replication数据存储区(我正在使用NDB)中,一致性是最终的。为了获得有保证的完整集,可以使用祖先查询。祖先查询还提供了一种很好的方式来获得特定祖先的所有“孩子”与无形的查询。简而言之,能够利用祖先模型在GAE中非常有用。

我似乎遇到的问题相当简单。假设我有联系人记录和消息记录。给定的联系人记录被视为每条消息的祖先。但是,可能会为同一个人创建两个联系人(用户错误,不同的数据点,等等)。这种情况会产生两个联系人记录,其中包含与之相关的消息。

我需要能够“合并”这两个记录,并将所有消息放入一大堆。理想情况下,我可以修改其中一个记录的孩子的祖先。

我能想到这样做的唯一方法是创建一个映射并让我的应用程序检查以查看记录是否已合并。如果有,请查看映射以查找一个或多个相关记录,并对其执行查询。这看起来非常低效。是否有更多的“按书”处理这个用例的方式?

1 个答案:

答案 0 :(得分:9)

更改实体祖先的唯一方法是删除旧实体并使用新密钥创建一个新实体。必须对祖先路径中的所有子(和大孩子等)实体执行此操作。如果无法做到这一点,那么您列出的解决方案就可以运行。

这是必需的,因为实体的祖先路径是其唯一键的一部分。实体的父母(即祖先路径中的实体)不需要存在,因此更改父母的密钥会使子项保留在没有父项的数据存储区中。