Google app engine AppEngine/Datastore:检索的最佳方式,因为祖先查询递归地返回所有内容

Google app engine AppEngine/Datastore:检索的最佳方式,因为祖先查询递归地返回所有内容,google-app-engine,go,data-modeling,google-cloud-datastore,Google App Engine,Go,Data Modeling,Google Cloud Datastore,当我使用祖先约束执行get()时,似乎得到了该祖先键的所有实体以及它的父级 在本例中,我使用祖先关系来表示同质树(所有节点都由同一种类表示;每个级别都立即一致)。我使用的所有ID都是全局唯一的,并且我在每个实体上都写入了父ID(除了在祖先路径中) 由于“按祖先”检索返回的数据太多(所有级别都在和低于当前级别,而不仅仅是直接级别;文档中没有提到这一点以及其他一些古怪之处),因此我需要添加一个过滤器,以确保返回当前级别 所以,问题是做一个祖先().filter()和只做过滤器()在效率上是否有差异,

当我使用祖先约束执行
get()
时,似乎得到了该祖先键的所有实体以及它的父级

在本例中,我使用祖先关系来表示同质树(所有节点都由同一种类表示;每个级别都立即一致)。我使用的所有ID都是全局唯一的,并且我在每个实体上都写入了父ID(除了在祖先路径中)

由于“按祖先”检索返回的数据太多(所有级别都在和低于当前级别,而不仅仅是直接级别;文档中没有提到这一点以及其他一些古怪之处),因此我需要添加一个过滤器,以确保返回当前级别

所以,问题是做一个
祖先().filter()
和只做
过滤器()
在效率上是否有差异,因为这两种方法对我产生的结果是一样的

谢谢。

只是
filter()
最终是一致的,而
祖先().filter()
是非常一致的


正如您所提到的,您需要按索引的属性筛选一个属性,以便只返回树的特定级别。

建议-确保您在GAE上进行测试。你可能需要重新考虑为这样的树使用祖先。我有一个类似的树(但在不同的层次上有不同的实体类型)。我发现,在GAE上运行时,在并发请求中只进行几次写入就执行了许多
get_by_id()
,这会导致实体根上出现大量数据争用异常(而且性能很差)——在本地devserver上一切都正常。现在我正在重构我的应用程序,一个接一个地删除级别之间的祖先,我看到性能有了很大的改进,但仍然会出现争用异常——我将删除所有这些异常。“争用异常”意味着GAE级别存在不可调和的一致性问题?为什么您会认为这是用例的诅咒,而不是实现中的bug?问题是,此时,我在第一次请求时预加载/同步树。这些都不是动态的,尽管我已经为它在未来的某个时候留下了空间(前提是用户基础偏好的理论变化)。为了确定存储的信息是否与配置树中的表示匹配,我需要它保持一致。想法?忽略第二部分。这不值得。这些数据总是比较静态(变化率低)。谢谢你提出这个问题。我不是说不可调和的问题——那些发生在写操作上并被devserver捕获的问题。我说的是随机发生的
TransactionFailedError:这些数据存储实体上存在太多争用。请再试一次。实体组键:
其中键指向实体组的根,堆栈跟踪表明
get\u by\u id()。发生率取决于在该实体组上执行写操作的请求的总速率。如果你只是在阅读,那么这可能不是你应用程序的问题。