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=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から送信されたすべてのメッセージをくれ」などのクエリに効率的に答えることができる祖先関係を作成することだと思いました。

4

2 に答える 2

2

親キーは子キーの一部であり、エンティティを取得するには完全なキーが必要です。

したがって、子エンティティを取得するには、完全なキーを知る必要があります。つまり、親キーを知る必要があります。

注: キーによる親子関係は、通常の SQL データベースにあるような関係関係を作成しません。親と子を同じ「エンティティ グループ」(エンティティを同じサーバーに配置するための派手な言葉) に配置するだけで、それらに対してトランザクションを実行できます。

于 2015-11-04T07:20:27.473 に答える