0

GAE のデータストアに対してかなり複雑なクエリを実行しようとしています。基本的に、購読者は特定の町または任意の町 (*)、特定の国または任意の国 (*)、特定の ... または任意の . .. (*)

ここで、サブスクライバーに ZA からのニュースについて通知したい場合、country=ZA に一致するすべてのサブスクライバーと、country=* に一致するすべてのサブスクライバーを検索する必要があります。他のフィールドについても同様です。

Query<Subscriber> query = ofy().load().type(Subscriber.class);

    query  = query.filter("searchCategory IN", Arrays.asList(new String[]{"*", category}));
    query = query.filter("searchCity IN", Arrays.asList(new String[]{"*", city}));
    query = query.filter("searchSuburb IN", Arrays.asList(new String[]{"*", suburb}));
    query = query.filter("searchTown IN", Arrays.asList(new String[]{"*", town}));
    query = query.filter("searchProvince IN", Arrays.asList(new String[]{"*", province}));
    query = query.filter("searchCountry IN", Arrays.asList(new String[]{"*", country}));
    query = query.limit(100);

    QueryResultIterator<Subscriber> iterator = query.iterator();
    while (iterator.hasNext()) {
        Subscriber subscriber = iterator.next();
        System.out.println(iterator.getCursor().toWebSafeString()); // exception here
    }

私はタスク キューを使用して、一度に 100 人 (クエリによっては 20k から 2M の結果) の膨大な数のサブスクライバーに通知しています。カーソルは、膨大な数の結果を管理可能なチャンクに分割する論理的な方法のように思えました。 ... アプリケーションを実行し、カーソルを取得しようとして Null Pointer Exception が発生するまで - IN ステートメントを使用する場合、カーソルがサポートされていないことが判明しました。

NOT_EQUAL および IN 演算子は複数のクエリで実装されるため、それらを使用するクエリはカーソルをサポートせず、CompositeFilterOperator.or メソッドで構築された複合クエリもサポートしません。

この状況でカーソルを使用できない場合の代替手段は何ですか?

4

2 に答える 2

2

ドキュメントによると、カーソルを使用できると思います

一部の NDB クエリはクエリ カーソルをサポートしていませんが、修正できます。クエリで IN、OR、または != が使用されている場合、クエリの結果は、キーで並べ替えられていない限り、カーソルで機能しません。アプリケーションが結果をキーで並べ替えずに fetch_page() を呼び出すと、BadArgumentError が返されます。User.query(User.name.IN(['Joe', 'Jane'])).order(User.name).fetch_page(N) でエラーが発生した場合は、User.query(User.name.IN) に変更します。 (['Joe', 'Jane'])).order(User.name, User.key).fetch_page(N)

NDB の方が高速で、自動キャッシングがあるので、NDB に切り替えることをお勧めします。

于 2013-11-12T07:36:28.873 に答える
1

1 つのオプションは、equals のみを使用してこれらの各クエリを個別に実行することです。これにより、一部のエントリのみを取得できますが、カーソルに加えて、実行しているクエリを覚えておく必要があります。これは、重複除外も処理しません。通知を送信している場合、これは問題になる可能性があります。

Prospective Search APIを調べることを検討する必要があります。これは実験的な機能ですが、やりたいことを正確に実行します。

基本的な考え方は、ユーザーごとにサブスクリプション クエリ ( など) を指定しsearchCountry=NZ、ニュース記事を処理して潜在的な検索 APIに送信すると、その記事に一致するすべてのサブスクリプション (クエリ) を提供できるというものです。

于 2013-11-12T06:56:09.527 に答える