8

日付順のデータストアに対してクエリを実行しようとすると、次のエラーが発生します。

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

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

日付順に並べ替えようとしないと、クエリはエラーなしで実行されます。データストア インデックスの下の appengine コンソールには次のように表示されます。

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

2 に答える 2

3

ローレンスに感謝します。あなたは私を正しい道に導いてくれました-私は答えを見つけたと思います. クエリは、インデックス定義と完全に一致する必要があります。

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

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

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: author
  - name: ref
  - name: date

でも、

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

成功します。同様に、インデックスに含まれるパラメーターよりも少ないパラメーターを持つクエリも失敗します。たとえば、次のようになります。

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

次のエラーで失敗します:

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)

実際には昇順でソートされていますが、私のインデックスでは DESCENDING 順になっています。修正は次のとおりです。

query = query.order(-Message.date)
于 2013-04-22T03:53:14.423 に答える