App Engine-Datenspeicher nicht unterstützt Operator OR
-
06-09-2019 - |
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!
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);