7

エンティティ ID と先祖を知っているエンティティ キーを取得したいと考えています。ID は、祖先によって定義されたエンティティ グループ内で一意です。ndb インターフェイスを使用することはできないようです。私がデータストアを理解しているように、この操作には完全なインデックススキャンを実行する必要があるという事実が原因である可能性があります。私が使用した回避策は、モデルに計算されたプロパティを作成することです。これには、キーの id 部分が含まれます。祖先クエリを実行してキーを取得できるようになりました

class SomeModel(ndb.Model):
    ID = ndb.ComputedProperty( lambda self: self.key.id() )

    @classmethod
    def id_to_key(cls, identifier, ancestor):
        return cls.query(cls.ID == identifier,
                         ancestor = ancestor.key ).get( keys_only = True)

動作しているように見えますが、この問題に対するより良い解決策はありますか?

更新 データストアの自然な解決策は、識別子の代わりに完全なパスを使用することです。最初は負担が大きすぎると思いました。Dragonx の回答を読んだ後、アプリケーションを再設計しました。驚いたことに、今ではすべてがずっとシンプルに見えます。追加の利点は、エンティティが使用するスペースが少なくなり、追加のインデックスが必要なくなることです。

4

4 に答える 4

8

私もこの問題に遭遇しました。あなたには解決策があると思います。

より良い解決策は、ID を使用してエンティティを参照するのをやめ、実際のキーまたは完全なパスを保存することです。

内部的には、ID の代わりにキーを使用しています。

私の残りのAPIではhttp://url/kind/id、エンティティを取得するために(idが「123」のように見えた)行っていました。http://url/kind/ancestor-ancestor-idこれを変更して、エンティティ(789-456-123)への完全な祖先パスを提供し、 その文字列を解析してキーを生成し、キーで取得しました。

于 2012-10-18T15:02:34.740 に答える
3

祖先に関する完全な情報があり、ID もわかっているので、次のようにキーを直接作成してエンティティを取得できます。

my_key = ndb.Key(Ancestor, ancestor.key.id(), SomeModel, id)
entity = my_key.get()

getこのようにして、お金と速度の両方の点で操作よりもコストがかかるクエリを作成することを回避できます。

お役に立てれば。

于 2012-10-18T13:10:38.167 に答える