4

次のようなものについてGoogleデータストアにクエリを実行しようとしています(pm-> persistanceManagerを使用):

String filters = "(  field == 'value' ||  field == 'anotherValue' )";
Query query = pm.newQuery(myType.class, filters);

実行すると、戻ってきます: App Engine データストアは演算子 OR をサポートしていません

この種のクエリに対するユーザー エクスペリエンスの最適なアプローチは何ですか?

どんな助けでも大歓迎です!

4

8 に答える 8

11

複数のクエリを実行します。データストアは、他のすべてのデータベースと同様に、論理和を効率的に実行できません。他のデータベースとは異なり、この難しさをユーザーに公開して、実行していることが効率的でないことを明確にします。唯一の解決策は、複数のクエリ (それぞれに 1 つずつ、または -) を実行し、それらを結合することです。

于 2009-05-31T03:32:51.660 に答える
4

GAE の JDO および JPA 実装がこれをサポートしているかどうかはわかりませんが、低レベル API を使用すると、1 つのクエリでこれに演算子 IN を使用できます。

Query query = new Query("Issue");
List<String> list = Arrays.asList("NEW", "OPEN", "ACCEPTED");
query.addFilter("status", FilterOperator.IN, list);

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
PreparedQuery preparedQuery = datastore.prepare(query);
for (Entity entity : preparedQuery.asIterable()) {
    // should iterate over 'NEW', 'OPEN' and 'ACCEPTED' issues
}
于 2010-02-12T20:02:14.263 に答える
2

Google App Engine - クエリとインデックスによると:

クエリ フィルタ

フィルターは、フィールド名、演算子、および値を指定します。値はアプリによって提供される必要があります。別のプロパティを参照したり、他のプロパティに関して計算したりすることはできません。演算子は次のいずれかです。< <= == >= >

注: Java データストア インターフェイスは、Python データストア インターフェイスに実装されている != および IN フィルター演算子をサポートしていません。(Python インターフェースでは、これらの演算子は複数のデータストア クエリとしてクライアント側ライブラリに実装されます。データストア自体の機能ではありません)。

フィルターの対象は、主キーやエンティティ グループの親を含む任意のオブジェクト フィールドにすることができます (「 トランザクション」を参照)。

エンティティが結果になるには、すべてのフィルターに一致する必要があります。&&JDOQL 文字列構文では、 (論理「and」) で区切られた複数のフィルターが指定されます。フィルターのその他の論理的な組み合わせ (論理的な "or"、"not") はサポートされていません。

App Engine データストアがクエリを実行する方法が原因で、1 つのクエリ< <= >= >で複数のプロパティに対して不等式フィルタ ( ) を使用することはできません。同じプロパティに対して複数の不等式フィルター (値の範囲のクエリなど) を使用できます。クエリの制限を参照してください。

基本的に、1 つまたは複数の「and」条件で探しているものを見つけることができるようにデータを再構築するか、2 つ (またはそれ以上) のクエリを介してデータを取得する必要があります。コードでそれをフィルタリング/結合します。

于 2009-05-31T00:59:47.977 に答える
1

レイト・ブレイキング・ニュース..少なくとも私はそれを手に入れています。最新の Java SDK for GAE をダウンロードしていたときに、リリース ノートで「Issue 29: Expose batch gets」が最新リリース (v1.2.1) で修正されていることに気付きました。基本的に、私たち (私はそれと同じサポートを探しています) は、「低レベル」の Datastore API にドロップダウンするのではなく、JDO ベースの代替手段を持っているようです。最新の Java GAE SDK をダウンロードしたばかりなので、まだ何もテストする機会がありませんが、できるだけ早くお知らせしたいと思います。この「修正」を確認する機会があった後、私が学んだことは何でも投稿します。

回答としてコメントを再投稿して StackOverflow のエチケットを破った場合は、お詫び申し上げますが、2 つの理由からそうすることにしました。第一に、同じ問題に再び取り組むのは私ですが、この新しい情報は、問題に対してまったく異なる「答え」を提供しているように見えるからです。そして第二に、私が提供した最初の回答をあなたがかなりの時間をかけて調べる前に、コメント フォームがあなたの注意を引くことができないのではないかと心配していました.

次回はもっとよく考えて行動します。

TL

于 2009-07-09T19:27:55.623 に答える
1

申し訳ありませんが、ゲームに遅れて..今日、あなたの質問に出くわしました。

「IN」と「OR」の動作を「シミュレート」するもう 1 つの方法は、「低レベル」の Datastore API を使用することです。DatastoreService は、キーのコレクションを受け取り、渡されたキーに一致するすべてのエンティティのマップを返す get() メソッドをサポートしています。これはインターフェイスですが、すぐに使用できるインスタンスを分配する便利な DatastoreServiceFactory が利用可能です。

残念ながら、Google は、この低レベルの API アプローチを促進したくなく、開発者が JDO または JPA を使用することを好むと判断したため、JavaDocs と、Google で「DatastoreService」 .

TL

于 2009-07-07T18:47:03.630 に答える
0

含むメソッドを使用できます

String filters = "( :values.contains(field) )";
Query query = pm.newQuery(myType.class, filters);
于 2015-07-22T10:10:36.333 に答える
0

cletus の回答に反して、OR-ing は動作しますが、最近のバージョンの App Engine ではとにかく動作します。

確かに、私が持っていた App Engine 1.3.0 では OR-ing が機能していないことがわかりましたが、Google App Engine - Queries and Indexes (彼の回答で参照されているのと同じソース cletus) によると、

エンティティが結果になるには、すべてのフィルターに一致する必要があります。JDOQL 文字列構文では、複数のフィルターを || で区切ることができます。(論理 "or") および && (論理 "and") ですが、|| に注意してください。分離するすべてのフィルターが同じフィールド名を持つ場合にのみ使用できます。言い換えれば、|| 分離されたフィルターを単一の contains() フィルターに結合できる状況でのみ有効です。

彼の回答以来 (そして最後に App Engine を更新してから)、App Engine はこの件に関してアップグレードされたに違いないと考えました。

App Engine を 1.3.4 に更新すると、OR-ing が機能します。制限付きですが。

とにかくcletusに感謝します:)

于 2010-06-11T15:51:01.913 に答える
0

「自分でやる」必要性を簡素化する 1 つの方法は、パラメーター化されたクエリを使用することです。

   Query query = pm.newQuery(mytype.class);
   query.setFilter("field == autoParam");
   query.declareParameters("String autoParam");

   List<String> params = myListOfThingsFieldCanBeEqualTo;

   Set merged = new HashSet();
   for (String f : params) {
     merged.addAll(q.execute(f));
   }
于 2009-06-08T20:30:11.663 に答える