データストアクエリのn番目のレコードを取得する方法
-
05-07-2019 - |
質問
GAE にモデル Foo があり、次のクエリがあるとします。
クエリ = Foo.all().order('-鍵')
n番目のレコードを取得したいと考えています。それを達成するための最も効率的な方法は何でしょうか?
以下のような順序付けプロパティが一意でない場合、ソリューションは壊れますか?
クエリ = Foo.all().order('-色')
編集:n > 1000
編集2:利用可能なページ (ページ 1、ページ 2、... など) を表示するフレンドリーなページング メカニズムを開発したいと考えています。185 ページ)、クエリ文字列には "?bookmark=XXX" の代わりに "?page=x" が必要です。page = x の場合、クエリはそのページの最初のレコードから始まるレコードをフェッチします。
解決
どの DBMS でも、これを効率的に行う方法はありません。どのような場合でも、少なくとも n 番目のレコードが見つかるまでインデックス レコードを順番に読み取ってから、対応するデータ レコードを検索する必要があります。これは GAE の fetch(count, offset) とほぼ同じですが、さらに 1000 レコードという制限があります。
これに対するより良いアプローチは、最後に取得したエンティティに対して注文するフィールドの値とエンティティのキーで構成される「ブックマーク」を保持することです。その後、中断したところから続行したい場合は、フィールドの値を不等式クエリの下限として追加し、最後に確認したレコードと一致するかそれを超えるまでレコードをスキップできます。
ユーザーに「わかりやすい」ページ オフセットを提供したい場合は、memcache を使用して開始オフセットとブックマーク (order_property、key) タプルとの関連付けを保存します。ページを生成するときは、最後のブックマークに続くエンティティのブックマークを挿入または更新します。ページをフェッチするときは、ブックマークが存在する場合はそれを使用するか、オフセットを使用してクエリを実行することでブックマークを生成します (オフセットが十分に大きい場合は複数のクエリを実行する可能性があります)。
他のヒント
Queryクラスのドキュメントは次の場所にあります。 http://code.google.com/appengine/docs/ python / datastore / queryclass.html#Query
クエリクラスは、フェッチウィッチに制限とオフセットを提供します あなたの場合は1とn
フェッチの実行時間は、オフセット+制限で直線的に増加します
あなたの場合に最適化する唯一の方法は、必要なレコードを確認することです ほとんどの場合、アクセスは配列の先頭に近づきます。
使用できます query.filter( 'key ='、n) query.get()
nのキーを持つ最初の一致を返します