8

私は日付順のデータストア上のクエリを実行しようとすると、私は次のエラーを取得:私は日までにご注文しようとしていない場合GAEデータストアをクエリするときにインデックスエラーを修正する方法はありますか?

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

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

をクエリがエラーなしで実行されます。 App Storeコンソールのデータストアインデックスには、

author ▲ , ref ▲ , date ▼ 
Serving 

私は間違っていますか?クエリを日付順に実行するにはどうすればよいですか?ありがとう!ここで

が私のエンティティ定義である:

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) 

、これは失敗したクエリです:

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 ] 

私のindex.yamlは含まれています:あなたが指定する必要が

indexes: 

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

答えて

4

をGoogleのスタイルで処理を高速化するためにインデックスが書き込まれたときに「順序付け」が行われるため、「方向」にも適用されます。

だから、あなたのindex.yamlは次のようにする必要があります:

indexes: 

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

ここ順序について、Googleの公式な説明です:

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.

私はこのことができます願っています。

+0

ありがとうございました。実際、私はインデックス定義の最後の行をコピーするのを忘れていました。アプリエンジンコンソールには、索引が作成されたことが示されます。▲、著者▲、日付▼だから私はこれが私の問題だとは思わないが、質問のインデックス定義を更新した。 – deltanine

3

ありがとうローレンス、あなたは正しい軌道に乗っている - 私は答えを見つけたと思う。クエリは、インデックス定義と正確に一致する必要があります。

これは、データストアの管理ボックスで異なるGQLクエリを試すことで検出されました。

たとえば、次の2つのクエリ:

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

が成功した、しかし

no matching index found. 

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

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

の両方で失敗します。同様に、インデックスが含まれているよりも少ないパラメータを持つクエリはまた、例えば、失敗します。

no matching index found. 

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

が問題だった私のクエリでは、行:

query = query.order(Message.date) 

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

はで失敗します

は実際には昇順でソートされていますが、インデックスにはDESCENDINGと表示されています。修正は:

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

あなたは大歓迎です!はい、クエリとインデックスの順序が完全に一致している必要があります。 –

関連する問題