1

com.google.appengine.api.datastore.Cursorは、単にインデックスの位置をGAEデータストアのインデックスに保存するとしますか?GAE Datastoreのカーソルは永続的で耐久性がありますか?

カーソルは耐久性がありますか?つまり、カーソルを永続的に保存して、インデックス内の5000番目の位置を指していた場合は、それが永遠にどこに向かうのかをもう一度確認し直すことができますか?

インデックスが5000エントリ未満に縮小されたらどうなりますか?このカーソルを使用するとエラーが発生するか、単に何も返されませんか?

大きなインデックス(100,000以上など)の場合は、最初に倍数5000位ごとにカーソルを取得して保存してから、このカーソルセットを使用してMap/Reduce方法?

私は実際にObjectifyを使用していますが、DSでは直接使用しませんが、AFAIKを使用すると、Indexesと比較してカーソルのプロパティに影響はありません。

答えて

3

カーソルは、元のクエリとの関連でのみ意味があります。これらは正確にインデックス位置/オフセットではありません。 Cursors and data updatesから:

カーソルの位置が返された最後の結果の後に結果リスト 内の位置として定義されます。カーソルはリスト内の相対位置ではありません(オフセットではありません)。結果のインデックススキャンを開始するときにCloud Datastore がジャンプできるマーカーです。 クエリの結果がカーソルの使用の間で変更された場合、クエリ通知はカーソルの後の結果で発生する の変更のみを行います。クエリーのカーソル位置が より前に新しい結果が表示された場合は、カーソルが取得された後に が結果として返されます。同様に、エンティティがクエリの結果が長くなりますが、カーソルの前に出現していない場合は、 カーソルが変更されていないと表示される結果は になります。最後に返された結果 が結果セットから削除された場合、カーソルは次の結果を見つける方法をまだ知っています。 Limitations of cursorsからまた

カーソルは、次の制限の対象となっている。

  • カーソルのみ元のクエリを実行し、同じアプリケーションで使用することができ、そしてのみ継続します同じクエリ。後続の検索操作でカーソル を使用するには、同じエンティティ種類、先祖 フィルタ、プロパティフィルタ、およびソート順を含む 元のクエリを正確に再構成する必要があります。 は、最初に生成された から同じクエリを設定せずにカーソルを使用して結果を取得することはできません。
  • NOT_EQUALおよびIN演算子は複数のクエリで実装されているため、それらを使用するクエリではカーソルがサポートされず、 コンポジットクエリもCompositeFilterOperatorまたは メソッドで構築されません。
  • 複数の値を持つプロパティで不等号フィルタまたは並べ替え順序を使用するクエリで、カーソルが期待通りに機能しない場合があります。 このような複数値プロパティの重複排除ロジックでは、検索間にが残らず、同じ結果が複数回返される になる可能性があります。
  • 新しいApp Engineのリリースでは、内部実装の詳細が変更され、それに依存するカーソルが無効になることがあります。アプリケーション が有効でなくなったカーソルを使用しようとすると、Cloud Datastore は、IllegalArgumentException(低レベルAPI)、 JDOFatalUserException(JDO)、またはPersistenceException(JPA)を発生させます。

あなたのデータはあなたがマップ内のカーソルを使用して、おそらくOKです変更しない場合は/(元のクエリを復元することによって)方式を減らす、事前に取得し、それらを含みます。

+0

結果セットを通ってページを移動するカーソルを保存するのはどうですか?たとえば、最新のすべてのアップロード(ページ順に逆順)を表示する必要があります。カーソルを単純に使用すると、常に1ページだけロードしてから次へ、次へ、次へなどに移動できます。オフセットを使用してP1からP10にジャンプすることはできません。カーソルを保存できたら(ページサイズが20の結果/ページに固定されているとします)、そのページの適切なカーソルを取得してそこから結果を得ることができます。 – markvgti

+0

新しいアップロード(データの更新)がない場合は、それを行う必要があります。ここの例:https://cloud.google.com/appengine/docs/python/datastore/query-cursors#cursors_and_data_updates –

+0

ハァッ?カーソルがインデックスの100番目のエントリを指している場合、新しいアップロードを追加しても、最初の結果として以前の99番目の結果が返されるという意味ではないでしょうか? カーソルはインデックスへのオフセットではなく、インデックス内の特定のエントリへのポインタ/参照ですか? – markvgti

関連する問題