簡體   English   中英

Google Datastore祖先查詢返回的數據太低

[英]Google Datastore ancestor query returning data too far down

我正在使用“收件箱/消息傳遞”結構,該結構允許多種類型的父母。 正如人們可以留下一些不同意見kind對象秒。 對於此示例,假設有人在對Article對象發表評論。

我們格式化數據的方式是,將注釋創建為Message對象,並且該對象是Article的子級( ArticleAccount的子級)。 因此,當我們查詢消息列表時,我們只需要查詢屬於Article實例的所有子消息。 看起來像這樣:

Message.query(ancestor=source_key)

source_key是我們正在查看的文章的Key

太好了,這確實很好,而且速度很快。

現在,我們想向這些Message對象添加回復 我認為我們只是將答復存儲到將Article添加到Message的方式。 也就是說,Reply只是Message另一個實例,而該Reply對象的父對象就是它正在回復的消息。 因此,基本上,您不對文章發表評論,而是對消息發表評論。

在紙面上聽起來不錯,但實際上,最終獲得的Key結構如下:

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

事實證明,當我們查詢消息列表時,它也會在響應中返回答復 ,就好像它們根本不是答復一樣。

一些問題:

  • 有什么辦法可以像“淺”查詢一樣? 要嚴格獲得Article的直系子孫?

  • 我已經閱讀了有關祖先查詢的工作方式的更多信息,並且由於祖先查詢的每秒寫入限制為1,所以我想知道將存儲方式更改為Message 不是 Article的子代的更好方法,並且而是在Message存在ArticleKeyProperty ,如果有道理的話。 而且可能沒有Message父母。 可能有很多人留下了評論文章,或也有很多人離開答復這些意見。 但是即使如此, Article還是Account的子類,還有許多其他種類的對象,通常,我們不會遇到許多寫不同的問題。 那么我們甚至會遇到這種寫限制嗎?

編輯:我已經進行了一些嘗試,並嘗試查詢給定消息的答復,所以我正在尋找具有另一條消息的父級(祖先)的所有消息。

因此,以此鍵作為祖先鍵: Key('Account', 5629499534213120, 'Article', 5946158883012608, 'Message', 5663034638860288)

我查詢我們的消息表,然后得到那個完全相同的鍵(以及其他消息)。 那怎么可能? 如果我指定一個祖先,那么在什么情況下可以取回我用來查詢祖先的對象,這在什么意義上有意義? 該消息的父項是:

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

因此,顯然祖先並不嚴格匹配那里。 為什么我的查詢會返回呢? 我基本上遇到的是Hastebin: https ://hastebin.com/karojolisi.py

關於寫限制的問題,如果您在數據存儲區模式下使用Cloud Firestore,則每秒寫1個限制是按實體而不是實體組進行的。

請參閱https://cloud.google.com/datastore/docs/firestore-or-datastore

“對實體組的寫入不再限於每秒1個。”

https://cloud.google.com/datastore/docs/concepts/limits

“對實體的最大寫入速率”是“每秒1”

因此,無論您采用哪種方法,在數據存儲區模式下,寫入都不是問題,因為消息和回復均不希望被編輯。 當然,除非您有任何匯總信息,例如給定消息的答復數,這些信息需要使用每個子記錄更新父消息記錄。

關於僅查詢文章消息而不是其答復的主要問題,一種選擇是擁有一個名為article_id的字段,並僅對頂級消息填充該字段,並將其也包含在索引中(祖先復合索引的前綴) 。 推薦使用article_id而不是布爾值的原因是,由於對該字段進行了索引,因此最好不要將該字段基於狹窄的值范圍。

選擇此方法將消息存儲在單獨的表中的原因是,屬於該文章的所有消息都將以初始方法存儲在附近,這對於讀取性能更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM