8

Kiedy próbuję uruchomić kwerendę na datastore uporządkowanej według daty pojawia się następujący błąd:Jak naprawić błąd indeksu podczas wysyłania zapytań do magazynu danych GAE?

NeedIndexError: no matching index found. 
The suggested index for this query is: 

- kind: Message 
    properties: 
    - name: author 
    - name: ref 
    - name: date 

Kwerenda działa bez błędu, jeśli nie spróbować na zamówienie według daty. Konsola appengine pod indeksami datastore mówi:

author ▲ , ref ▲ , date ▼ 
Serving 

Co robię źle? Jak mogę uruchomić zapytanie uporządkowane według daty? Dzięki!

Oto moja definicja podmiotu:

from google.appengine.ext import ndb 

class Message(ndb.Model): 
    subject = ndb.StringProperty() 
    body = ndb.TextProperty() 
    date = ndb.DateTimeProperty(auto_now_add=True) 
    ref = ndb.StringProperty(required=True) 
    author = ndb.KeyProperty(required=True) 

i to jest kwerenda, która kończy się niepowodzeniem:

def readMessages(ref, user = None): 
    query = Message.query() 
    query = query.filter(Message.ref == ref) 
    if user: 
     query = query.filter(Message.author == user.key) 
    query = query.order(Message.date) 

# convert to a list so we can index like an array 
return [ message for message in query ] 

Moja index.yaml zawiera:

indexes: 

- kind: Message 
    properties: 
    - name: author 
    - name: ref 
    - name: date 
    direction: desc 

Odpowiedz

4

Musisz określić "Kierunek" również dlatego, że "zamawianie" odbywa się, gdy indeks jest napisany, aby przyspieszyć rzeczy w stylu Google.

Więc twój index.yaml powinno być tak:

indexes: 

- kind: Message 
    properties: 
    - name: author 
    - name: ref 
    - name: date 
    direction: desc 

Oto oficjalny opis Google'a o kolejności:

The direction to sort, either asc for ascending or desc for descending. This is only required for properties used in sort orders of the query, and must match the direction used by the query. The default is asc.

Mam nadzieję, że to pomaga.

+0

Dzięki. Właściwie, zapomniałem skopiować ostatniego wiersza definicji indeksu.Konsola mechanizmu aplikacji wskazuje, że indeks został utworzony jako ref ▲, autor ▲, data ▼. Więc nie sądzę, że to jest mój problem, ale zaktualizowałem definicję indeksu w pytaniu. – deltanine

3

Dzięki Lawrence, masz mnie na dobrej drodze - myślę, że znalazłem odpowiedź. Zapytanie musi DOKŁADNIE pasować do definicji indeksu.

Odkryłem to przez wypróbowanie różnych zapytań GQL w polu administracyjnym datastore.

Na przykład, następujące pytania: 2

SELECT * FROM Message where ref='' and author='' order by date 
SELECT * FROM Message where ref='' and author='' order by date asc 

oba nie z:

no matching index found. 

The suggested index for this query is: 
- kind: Message 
    properties: 
    - name: author 
    - name: ref 
    - name: date 

Jednakże

SELECT * FROM Message where ref='' and author='' order by date desc 

uda. Podobnie, zapytań, które mają mniej parametrów niż indeks zawiera również zawiedzie, np:

SELECT * FROM Message where ref='' order by date DESC 

nie powiedzie się z:

no matching index found. 

The suggested index for this query is: 
- kind: Message 
    properties: 
    - name: ref 
    - name: date 
    direction: desc 

więc problem był w moim zapytaniu, linia:

query = query.order(Message.date) 

sortuje w kolejności rosnącej, ale mój indeks zawiera polecenie DESCENDING. Poprawka jest następująca:

query = query.order(-Message.date) 
+0

nie ma za co! tak, to musi być dokładne dopasowanie zapytania i kolejności indeksowej. –