0

私のGAEアプリケーションでは、日付順に並べ替える必要があります。問合せは、フィルタ内のcontaintしているが、これは次のようなエラーが生じている:GAE NDBマルチクエリをカーソルで並べ替える

BadArgumentError: _MultiQuery with cursors requires __key__ order 

は今、私はエラーとしてキーでソートに変更することをお勧め他のSOの質問(like this one)、(を読んできましたまた指摘する)。しかし問題は、その目的のためにクエリが役に立たなくなることです。日付でソートする必要があります。これを達成するための方法は何でしょうか?

答えて

0

Cloud DatastoreサーバーはINをサポートしていません。 NDBクライアントライブラリは、INというクエリを等価演算子で複数の単一のクエリに分割することによって、この機能を効果的に偽造します。次に、クライアント側で結果をマージします。

これらの単一のクエリのうち1つ以上で同じエンティティが返される可能性があるため、Key **で注文していない限り、これらの値をマージするのは計算上愚かです*。

関連、あなたがより良い理解を得るためにunderlying caveats/limitations on cursorsに読み込む必要があります。INで使用される値のリストは、静的リストではなく、実行時に決定された場合

  • Because the NOT_EQUAL and IN operators are implemented with multiple queries, queries that use them do not support cursors, nor do composite queries constructed with the CompositeFilterOperator.or method.
  • Cursors don't always work as expected with a query that uses an inequality filter or a sort order on a property with multiple values. The de-duplication logic for such multiple-valued properties does not persist between retrievals, possibly causing the same result to be returned more than once.

を回避するには、としてこれを計算することですエンティティを書き込むときにインデックス付きブール値フィールド。これにより、1つの等価フィルタを使用できます。たとえば、バグトラッカーがあり、開いている問題のリストを表示する場合は、クエリにIN('new', 'open', 'assigned')制限を使用することがあります。代わりにis_openというプロパティをTrueに設定して、INの条件が不要になるように設定することもできます。


*計算上愚か:現在、検索エンティティが重複しているかどうかを決定する値を、前の無制限の数の上で直線走査を行うことが必要です。概念的にカーソルと互換性がないとも知られています。

**キーは、次の値のセットを取得する異なる単一のクエリを交互に使用でき、進行中の結果セット全体でリニアスキャンを行うことを心配する必要がないため、機能します。これにより、動作する有界データセットが得られます。

+0

ありがとう、私は旗のアイデアと一緒に遊んで、私が望むことをするためにそれを得ることができるかどうかを見ます。 – Vincent

関連する問題