0

當我向數據存儲中插入消息時,我使用消息的序號創建密鑰並與發送消息的用戶建立祖先關係。當我嘗試使用僅從序列號創建的密鑰來檢索消息時,它失敗。如果我將插入更改爲使用僅基於序號的密鑰,則稍後的檢索將成功。如果我使用祖先關係創建密鑰,則Google應用引擎數據存儲失敗

代碼明智

這種失敗:

存儲:

p_key = ndb.Key(StoredBcastMsg,sendingUser) 
c_key = ndb.Key(StoredBcastMsg,prof['seqNum'],parent=p_key) 
prof['key']=c_key 
StoredBcastMsg(**prof).put() 

檢索失敗

msgToRet=ndb.Key(StoredBcastMsg,seqNum).get() #Fails even though sequence number is there in the store 

這成功:

存儲:

prof['key']=c_key 
StoredBcastMsg(**prof).put() 
c_key = ndb.Key(StoredBcastMsg,prof['seqNum']) 

檢索成功:

msgToRet=ndb.Key(StoredBcastMsg,seqNum).get() #Succeeds 

這是預期的行爲?我認爲在創建密鑰時添加parent =標籤的唯一區別是創建祖先關係,以便高效地回答諸如「給我由用戶X發送的所有消息」之類的查詢。

+0

都能跟得上你的祖先爲目的的評估是錯誤的。請參閱下面的答案。這實際上是關於實體羣體的。如果您之後的所有關係都是父/子關係,並且不需要或不需要實體組,則可以使用普通查詢。實體組的祖先也不能改變。如果您想更改實體組中的父項,您可以使用其他密鑰進行刪除和創建 –

回答

2

父鍵是子鍵的一部分,您需要完整的鍵來檢索實體。

因此,要檢索子實體,您需要知道完整的密鑰,這意味着您需要知道父密鑰。

注意:通過鍵的父子關係不會在正常SQL數據庫擁有它的意義上創建關係關係。它只是將父母和孩子放在同一個「實體組」中(將實體放在同一臺服務器上的花哨詞),它允許您在其上進行交易。

+0

感謝您的回答。因此,如果我使用序列號作爲關鍵字,它看起來像我需要通過屬性過濾來獲取我想要的信息(獲取用戶X發送的所有消息)。 –

0

正如你上面所說的:

p_key = ndb.Key(StoredBcastMsg,sendingUser) 
c_key = ndb.Key(StoredBcastMsg,prof['seqNum'],parent=p_key) 
prof['key']=c_key 
StoredBcastMsg(**prof).put() 

這種成功。要獲得這個實體,必須使用完全相同的關鍵:

msgToRet=c_key.get() 

或者,在一個較長的格式:

p_key = ndb.Key(StoredBcastMsg,sendingUser) 
msgToRet=ndb.Key(StoredBcastMsg,seqNum,parent=p_key).get() 
相關問題