Google cloud platform Google数据存储祖先查询返回的数据太低

Google cloud platform Google数据存储祖先查询返回的数据太低,google-cloud-platform,google-cloud-datastore,app-engine-ndb,Google Cloud Platform,Google Cloud Datastore,App Engine Ndb,我有一个“收件箱/消息”结构,我正在工作,它允许多种类型的父母。与中一样,人们可以在几种不同的类型的对象上留下注释。在本例中,假设有人在文章对象上留下评论 按照我们格式化数据的方式,注释被创建为消息对象,该对象是文章的子对象(而文章是帐户的子对象)。因此,当我们查询消息列表时,我们只需查询属于文章实例的所有消息。看起来是这样的: Message.query(祖先=源密钥) source\u key这是我们正在查看的文章的key 太好了,这真的很好,速度也很快 现在,我们想向那些消息对象添加回复。

我有一个“收件箱/消息”结构,我正在工作,它允许多种类型的父母。与中一样,人们可以在几种不同的
类型的对象上留下注释。在本例中,假设有人在
文章
对象上留下评论

按照我们格式化数据的方式,注释被创建为
消息
对象,该对象是
文章
的子对象(而
文章
帐户
的子对象)。因此,当我们查询消息列表时,我们只需查询属于
文章
实例的所有消息。看起来是这样的:

Message.query(祖先=源密钥)

source\u key
这是我们正在查看的文章的
key

太好了,这真的很好,速度也很快

现在,我们想向那些
消息
对象添加回复。我想我们存储回复的方式与将
消息
s添加到
文章
s的方式相同。也就是说,回复只是
消息
的另一个实例,该回复对象的父对象就是它所回复的消息。所以基本上,你不是在文章上留下评论,而是在留言上留下评论

这在纸面上听起来不错,但实际上,它最终得到的
键的结构如下所示:

Key('Account',5629499534213120',Article',59461583012608',Message',6509108836433920)

结果是,当我们查询消息列表时,它也会在响应中返回回复,就好像它们根本不是回复一样

一些问题:

  • 我们有什么办法可以像“肤浅”的查询那样做吗?要严格地只获取该
    文章的直系子项

  • 我已经阅读了更多关于工作的内容,因为祖先查询有每秒写入1次的限制,我现在想知道是否最好将存储方式更改为
    消息
    不是
    文章
    的子项,而是在
    消息
    上存在
    文章
    键属性
    ,如果这有道理的话。而且可能没有
    消息的父级。可能有很多人对一篇文章发表评论,也可能有很多人对这些评论发表回复。但即便如此,
    文章
    也是
    帐户
    的子对象,以及许多其他类型的对象,通常我们不会遇到任何不同写入的问题。那么,我们会遇到这种写限制吗

编辑:我已经移动了一点,尝试只查询给定消息的回复,所以我要查找所有具有另一个消息的父(祖先)的消息

因此,将此密钥作为祖先:
key('Account',5629499534213120',Article',59461583012608',Message',566303438860288)

我查询我们的消息表,并返回完全相同的键(以及其他消息)。这怎么可能?如果我指定了一个祖先,那么在什么情况下,我将返回我用来查询祖先的同一个对象是有意义的?该消息的父级只是:

Key('Account',5629499534213120',Article',594615883012608)


所以,很明显,祖先在这里并不完全匹配。为什么我的查询会返回它呢?基本上,我遇到的是:关于写限制的问题,如果您在数据存储模式下使用Cloud Firestore,那么每秒写入1次的限制是按实体而不是实体组

“对实体组的写入不再限于每秒1次。”

“对实体的最大写入速率”为“每秒1次”

因此,无论采用哪种方法,在数据存储模式下,写操作都不应该成为一个问题,因为消息和回复不需要编辑。当然,除非您有任何类型的聚合信息,如给定消息的回复数,需要使用每个子记录更新父消息记录

关于只查询文章的消息而不查询其回复的主要问题,一个选项是使用名为article_id的字段,并仅为顶级消息填充此字段,并将其也包含在索引(祖先复合索引的前缀)中。推荐article_id而不是boolean的原因是,由于此字段已编制索引,因此最好不要将字段基于狭窄的值范围


选择此方法而不是将消息存储在单独的表中的原因是,属于一篇文章的所有消息都将与初始方法存储在一起,这有利于提高读取性能。

关于写限制问题,如果您在数据存储模式下使用云Firestore,那么每秒写入1次的限制是按实体而不是按实体组

“对实体组的写入不再限于每秒1次。”

“对实体的最大写入速率”为“每秒1次”

因此,无论采用哪种方法,在数据存储模式下,写操作都不应该成为一个问题,因为消息和回复不需要编辑。当然,除非您有任何类型的聚合信息,如给定消息的回复数,需要使用每个子记录更新父消息记录

关于只查询文章的消息而不查询其回复的主要问题,一个选项是使用名为article_id的字段,并仅为顶级消息填充此字段,并将其也包含在索引(祖先复合索引的前缀)中。推荐article_id而不是boolean的原因是,由于此字段已编制索引,因此最好不要将字段基于狭窄的值范围

为什么要这样做