4

祖先制約付きでget()を実行すると、その祖先キーとそれが親であるすべての祖先のすべてのエンティティを取得したようです。AppEngine/Datastore:祖先クエリがすべてを再帰的に返すために最も良い方法

この場合、先祖関係を使用して均質なツリー(すべてのノードが同じ種類で表され、すべてのレベルが一貫性があります)を表しています。私が使用しているすべてのIDはグローバルに一意であり、祖先のパスに加えて各エンティティに親IDが書かれています。

祖先検索ではデータが多すぎます(直接のレベルではなく、すべてのレベルが返されるため、ドキュメントにはこれと他のいくつかの偏心が記載されていません)ので、フィルタを追加する必要があります私はちょうど現在のレベルを取得することを確認します。

ancestor().filter()filter()を実行する効率に違いがあるかどうかということは、どちらも同じ結果が出るからです。

ありがとうございました。

+0

アドバイス - GAEでテストしてください。このようなツリーのために祖先を再検討する必要があるかもしれません。私は似たようなツリーを持っていました(しかし、異なるレベルで異なるエンティティの種類があります)。私は、GAE上で実行しているときに、エンティティのルート(およびパフォーマンスが悪い)上で多数のデータ競合例外が発生していたことを発見しました。すべてローカルのdevserver上で正常に表示されました。今、私はレベル間で祖先を1つずつ落とすために私のアプリをリファクタリングしていますが、大きなパフォーマンス向上が見られますが、引き続き競合例外が発生します。 –

+0

「競合の例外」は、GAEレベルでの整合性のとれない一貫性の問題を意味しますか?なぜこれはあなたの実装のバグではなく、ユースケースの呪いだと思いますか?問題は、この時点では、最初のリクエストでツリーをプリロード/同期させることです。将来のある時点(私はユーザベースの嗜好の理論的な変化を前提とする)になる余地を残していますが、動的なものはありません。格納された情報が構成ツリー内の表現と一致するかどうかを確認するためには、一貫性が必要です。思考? –

+0

2番目の部分は無視してください。それはそれだけの価値はありません。このデータは常に静的ではありません(低い変化率)。それを持っていただきありがとうございます。 –

答えて

4

filter()は最終的に一貫性があり、ancestor().filter()は強く一貫しています。

あなたが言及したように、特定のレベルのツリーを戻すには、インデックス付きのプロパティをフィルタリングする必要があります。

関連する問題