Frage

Ich versuche, den Google-Datenspeicher für etwas abzufragen, wie (mit Uhr -> persistanceManager):

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

Wenn ich ausführen - ich bin immer wieder. App Engine-Datenspeicher nicht unterstützt Operator ODER

Was ist der beste Ansatz bei Menschen Erfahrung für diese Art von Fragen?

Jede Hilfe willkommen!

War es hilfreich?

Lösung

mehr Abfragen durchführen. Der Datenspeicher, wie alle anderen Datenbanken ist nicht in der Lage, effizient Disjunktionen auszuführen. Im Gegensatz zu anderen Datenbanken, macht es diese Schwierigkeit für den Benutzer, um deutlich zu machen, dass, was Sie tun, ist nicht effizient. Ihre einzige Lösung ist, mehrere Abfragen auszuführen - eine für jeden oder -. Und kombinieren sie

Andere Tipps

Ich weiß nicht, ob GAE JDO und JPA-Implementierungen dies unterstützen, aber unter Verwendung des Low-Level-API, können Sie den Operator IN für diesen, in einer Abfrage.

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
}

Nach Google App Engine - Anfragen und Indizes :

  

Abfragefilter

     

Filter einen Feldnamen angibt,   ein Operator und ein Wert. Der Wert   müssen vom App bereitgestellt werden; es kann nicht   beziehen sich auf eine andere Eigenschaft oder sein   in Bezug auf die anderen berechnet   Eigenschaften. Der Bediener kann jede von   die folgenden: < <= == >= >

     
    

Hinweis: Die Java-Datenspeicher-Schnittstelle nicht unterstützt die = und     IN-Filter     Operatoren, die in die umgesetzt werden     Python-Datenspeicher-Schnittstelle. (In dem     Python-Schnittstelle, diese Betreiber     in der Client-Seite implementiert     Bibliotheken als mehrere Datenspeicher     Abfragen; sie sind nicht Eigenschaften der     Datenspeicher selbst.)

  
     

Das Thema eines Filters kann beliebig sein   Objektfeld, einschließlich der primären   Schlüssel und die Entität Konzernmutter (siehe    Transaktionen ).

     

Ein Unternehmen muss alle Filter entsprechen sein   ein Ergebnis. In der JDOQL String-Syntax,   mehrere Filter angegeben   getrennt durch && (logisch „und“).   Andere logische Kombinationen von Filtern   (Logisch „oder“, „nicht“) sind nicht   unterstützt.

     

Durch die Art und Weise der App Engine   Datenspeicher führt Abfragen, eine einzige   Abfrage kann nicht Ungleichheitsfilter verwenden   (< <= >= >) auf mehr als einer   Eigentum. Mehrere Ungleichheitsfilter   auf der gleichen Eigenschaft (wie Abfragen   für eine Reihe von Werten) sind zulässig.   Siehe Einschränkungen bei Abfragen .

Im Grunde wirst du entweder, um Ihre Daten zu strukturieren, so dass Sie finden können, was Sie mit einer Bedingung oder mehrere „und“ Bedingungen suchen oder Sie gehen zu müssen, um die Daten über zwei abzurufen (oder mehr) Abfragen und Filter / kombinieren sie es in Ihrem Code.

Sorry, ich bin spät, um das Spiel .. ich auf Ihre Frage heute nur lief.

Eine andere Art und Weise zu „simulieren“ ‚IN‘ und ‚OR‘ Verhalten ist die „low level“ Datenspeicher-API zu verwenden. Das Datastor unterstützt einen get () -Methode, die eine Sammlung von Keys akzeptiert und gibt eine Karte aller Unternehmen, die die übergebenen Schlüssel abgestimmt. Es ist eine Schnittstelle, aber es ist ein handliches DatastoreServiceFactory zur Verfügung, die eine ready-to-use-Instanz verzichtet wird.

Leider entschied Google, dass sie nicht wollen, diesen Low-Level-API-Ansatz zu fördern und zu bevorzugen, dass die Entwickler verwenden JDO oder JPA, so gibt es keine Dokumentation außer dem JavaDocs und was Codebeispiele, die Sie vielleicht finden, wenn Sie Google "Datastor".

TL

Späte Bruch News .. zumindest bin ich einfach zu bekommen. Als ich den neuesten Java-SDK für GAE wurde das Herunterladen ich auf der Veröffentlichung bemerkt stellt fest, dass „Ausgabe 29: Batch Expose wird“ in der neuesten Version (v1.2.1) festgelegt wurde. Grundsätzlich scheint es, dass wir (ich bin auf der Suche für die gleiche Unterstützung wie es scheint) eher eine JDO basierte Alternative haben, als wenn man bis auf die „low-level“ Datastor API fallen zu lassen. Ich habe gerade den neuesten Java GAE SDK heruntergeladen, so dass ich keine Gelegenheit, etwas zu testen, noch gehabt haben, aber ich wollte Ihnen ein Heads-up so schnell wie möglich geben. Ich werde alles mehr poste ich erfahren, nachdem ich eine Chance hätte, um zu bestätigen diese „reparieren“.

Bitte meine Entschuldigung akzeptieren, wenn ich meinen Kommentar als Antwort Stackoverflow Etikette durch erneute Entsendung gebrochen habe, aber ich beschlossen, es aus zwei Gründen zu tun. Zum einen, weil, auch wenn ich es bin wieder zum selben Thema, IMHO diese neuen Informationen eine völlig andere „Antwort“ auf das Problem zu schaffen scheint. Und zweitens, ich war besorgt, dass die Kommentarfunktion nicht Ihre Aufmerksamkeit bekommen könnte, bevor Sie sehr viel Zeit damit verbracht, würde ein Blick in die erste Antwort, die ich zur Verfügung gestellt.

Das nächste Mal werde ich denke, mehr sorgfältig, bevor Sie handeln.

TL

Eine Möglichkeit, mit zu vereinfachen, um „do it yourself“ könnte sein, parametrisierte Abfragen zu verwenden:

   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));
   }

Im Gegensatz zu cletus' Antwort, OR-ing Werke , in der neueren Version von App Engine sowieso.

Ja, ich OR-ing funktioniert nicht in App Engine 1.3.0, die ich hatte, aber nach Google App Engine - Anfragen und Indizes (die gleiche Quelle cletus in seiner Antwort genannt)

  

Ein Unternehmen muss alle Filter entspricht ein Ergebnis. In der JDOQL String-Syntax können Sie mehrere Filter mit trennen || (Logisch „oder“) und && (logische „und“), hält, obwohl daran, dass || kann nur eingesetzt werden, wenn die Filter es alle die gleichen Feldnamen haben trennt. Mit anderen Worten: || nur legal ist in Situationen, in denen die Filter trennt sie kombiniert werden können, in eine einzelne enthält (Filter).

Ich dachte, da seine Antwort (und da ich meine aktualisierte App Engine letzten), App Engine in dieser Angelegenheit aufgerüstet worden sein.

Update App Engine 1.3.4 und die OR-ing funktioniert! Obwohl mit der Einschränkung.

Dank Cletus trotzdem:)

Sie können mit der Methode enthält

String filters = "( :values.contains(field) )";
Query query = pm.newQuery(myType.class, filters);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top