2016-08-22 6 views
0

A私は関係なく、祖先の、その文字列ID stringIDあるBを検索する方法をB祖先がわからないキーを持つエンティティをクエリする方法はありますか?

type A struct {} 
type B struct {} 

の祖先でありますか?

ctx := appengine.NewContext(r) 
a := ??? // 'A' may not exist, so what do I do here? 
k := datastore.NewKey(ctx, "B", "stringID", 0, a) 
e := new(B) 
if err := datastore.Get(ctx, k, e); err != nil { 
    http.Error(w, err.Error(), 500) 
    return 
} 
+0

'datastore.NewKey(ctx、" B "、" stringID "、0、nil)' – abhink

+2

@abhink:nilを渡すと、このエンティティは親を持たなくなります。エンティティはその親を変更することはできません。 –

答えて

2

祖先エンティティーが存在しない(Bおよび祖先Aも存在しないかもしれない)、そのIDまたは名前を知らなければなりません。そうしないと、子エンティティの一意のキーを作成できなくなります。 Aの子とBの子は同じIDまたは名前を持つことに注意してください。

エンティティを削除して新しいエンティティを作成することもできますが、作成したエンティティの親を変更することはできません。

+0

部分的なキー名の検索などができることを期待していました。私の設計では、stringIDはユニークなので、Bが存在するかどうかテストします。私は強固な一貫性を失うだろうが、私はちょうどBの重要な参照をするだろうと思う。 – Morrowless

1

あなたは(あなたがdatastore.Put()を呼び出すときに、エンティティのみ作成されます)、実際にaエンティティを作成することなくaためcreate a keyことができます。その後、そのキーを使用してb(またはそのキーだけを作成します)を作成することができます。

クエリの面では、Bタイプのすべてのエンティティに対してkeys-only queryを実行し、各キーチェックでキーのstringIDが希望のstringIDと一致するかどうかを確認できます。異なる祖先を持つエンティティに対して複数の結果を得ることができます - stringIDは同じ祖先(または祖先がまったくない)の場合にのみ一意のです。

+0

私は確かにキーのみのクエリにすることができます。アイデアをありがとう。技術的には私はaの鍵を作ることができますが、a-> bのグループが存在すれば無視しています。 – Morrowless

+0

キー作成の段落は「Aが存在しない可能性があるので、ここで何をしますか?私が質問の一部として解釈したコードのコメント –

関連する問題