6

Próbuję kwerendy magazynu danych, a moje zapytania wygląda następująco:Problemy z zapytaniem GQL, Google Datastore. Błąd z wielu warunków i powyżej i poniżej operatorów

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

To nie działa choć. Otrzymuję ten błąd w oknie zapytań Datastore:

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

a to błąd, gdy uruchomię mój kod:

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

proste prośby, jak działać:

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

ja korzystającego tylko jedna kolumna tutaj może dlatego?

Nie,

Potem próbowałem żądania takiego:

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

To działało.

Starałem się patrzeć rozwiązania i natknąłem tej strony: https://cloud.google.com/datastore/docs/tools/indexconfig#Datastore_About_index_yaml

Po przejściu tej stronie zebrałem że muszę plik index.yaml gdzieś. Ma wejść do folderu o nazwie WEB-INF. Ale nie mam tego folderu.

Jest to mały urywek mojego kodu:

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

Gdzie znajduje się plik 'appengine-web.xml'? – Nicholas

+0

@Nicholas Nie mam go nigdzie, mój program może wdrożyć i uruchomić bez niego. –

+0

Czy możesz opublikować pełną strukturę katalogów swojej aplikacji? – Nicholas

Odpowiedz

2

Błąd masz jest ponieważ kwerenda próbujesz wymaga Composite indexes które nie są dostępne domyślnie. Muszą być określone w ciągu index.yaml.

Artykuł Creating index files, który jest nieco inny niż opublikowany, jest przeznaczony specjalnie dla aplikacji Java działających w elastycznym środowisku.

Istnieją 2 sposoby, aby utworzyć index.yaml:

  1. ręcznie za pomocą dowolnego edytora tekstu następujące zasady i strukturę jak przewidziano w Index definitions.
  2. Generuj plik podczas testowania lokalnego. Można to zrobić za pomocą polecenia gcloud beta emulators datastore start. Możesz także użyć opcji --data-dir <dir>, aby określić, gdzie powinno być napisane wygenerowane index.yaml.

Wtedy, gdy masz index.yaml i tego samego katalogu jako app.yaml, można wdrożyć go gcloud preview app deploy index.yaml z tego katalogu. Ten proces jest krótko udokumentowany w Deploying the index file.

Polecam również lekturę Organizing yaml Configuration Files.

+0

Dziękuję, spróbuję tego, ale są dwa miejsca, w których znajdują się pliki app.yaml, jeden jest w src/main/appengine, a drugi w docelowej/appengine-staging. W którym katalogu powinienem umieścić index.yaml? –

+0

'src/main/appengine', jak zakładam, gdzie używasz' gcloud preview app deploy ' – Nicholas

+0

Dziękuję, dam ci to zdjęcie i dam ci znać jak to działa. –