6

ich den Datenspeicher abzufragen, ich versuche, meine Abfrage sieht wie folgt aus:Probleme mit GQL-Abfrage, Google Datastore. Fehler mit mehreren Bedingungen und größer und kleiner als Operatoren

SELECT * 
FROM mydb 
WHERE Latitude = "18.1" AND Number > "1" 

Es ist nicht jedoch nicht funktioniert. Ich erhalte diese Fehler in dem Datenspeicher-Suchfeld:

GQL query error: Your Datastore does not have the composite index (developer-supplied) required for this query.

Und diesen Fehler, wenn ich meinen Code ausführen:

no matching index found. recommended index is:\n- kind: mydb\n properties:\n - name: Location\n - name: Number\n

Einfache Anfragen wie diese Arbeit:

SELECT * 
FROM mydb 
WHERE Number > "1" AND Number < "5" 

mir nur Zugriff auf eine einzelne Spalte hier vielleicht deshalb?

Nö,

Dann habe ich versucht, eine Anfrage wie folgt aus:

SELECT * 
FROM mydb 
WHERE Latitude = "18.1" AND Number = "1" 

Das funktionierte.

Ich habe versucht, eine Lösung zu suchen, und ich auf dieser Seite kam: https://cloud.google.com/datastore/docs/tools/indexconfig#Datastore_About_index_yaml

Nachdem durch diese Seite zu gehen, habe ich gesammelt, dass ich irgendwo eine index.yaml Datei benötigen. Es soll in einen Ordner namens WEB-INF gehen. Aber ich habe diesen Ordner nicht.

Dies ist ein kleiner Ausschnitt aus meinem Code:

Query<Entity> query = Query 
       .gqlQueryBuilder(Query.ResultType.ENTITY, 
         "SELECT * FROM " + kind + " WHERE Location = @location AND Number <= @number") 
       .setBinding("number", "5").setBinding("location", "18.1").build(); 
QueryResults<Entity> results = datastore.run(query); 
+0

Wo befindet sich Ihre 'appengine-web.xml'? – Nicholas

+0

@Nicholas Ich habe es nirgends, mein Programm kann ohne es bereitstellen und ausführen. –

+0

Können Sie die vollständige Verzeichnisstruktur Ihrer Anwendung posten? – Nicholas

Antwort

2

Der Fehler, den Sie erhalten, ist, weil die Abfrage Sie versuchen Composite indexes erfordert, die nicht standardmäßig verfügbar sind. Sie müssen innerhalb von index.yaml angegeben werden.

Der Artikel Creating index files, der sich etwas von dem veröffentlichten unterscheidet, ist speziell für Java-Anwendungen, die in der flexiblen Umgebung ausgeführt werden.

Es gibt zwei Möglichkeiten, ein index.yaml zu schaffen: in Index definitions

  1. manuell mit Ihrem bevorzugten Texteditor nach den Regeln und Struktur, wie vorgeschrieben.
  2. Generieren Sie die Datei, während Sie lokal testen. Dies kann mit dem Befehl gcloud beta emulators datastore start erfolgen. Sie können auch die Option --data-dir <dir> verwenden, um anzugeben, wo der generierte index.yaml geschrieben werden soll.

Dann, sobald Sie index.yaml und das gleiche Verzeichnis wie app.yaml haben, können Sie es mit gcloud preview app deploy index.yaml aus diesem Verzeichnis bereitstellen. Dieser Prozess ist in Deploying the index file kurz dokumentiert.

Ich würde auch lesen Organizing yaml Configuration Files empfehlen.

+0

Danke, ich werde weitermachen und das versuchen, aber es gibt zwei Orte, die app.yaml Dateien enthalten, eine ist in src/main/appengine und die andere ist in Ziel/appengine-staging. In welches Verzeichnis soll ich index.yaml setzen? –

+0

'src/main/appengine' wie ich annehme, wo Sie' gcloud preview app deploy' betreiben – Nicholas

+0

Vielen Dank, ich gebe Ihnen eine Chance und lassen Sie wissen, wie es geht. –

Verwandte Themen