0

射影クエリに特定のプロパティを含める必要があるのはなぜかと思います。「foo」プロパティの個別のリストを取得しようとしています。

Object.query(projection=[Object.foo], distinct=True) \
    .filter(Object.username == user.nickname()) \
    .filter(Object.bar >= value) \
    .fetch()

これは、提案されたインデックスが稼働しているにもかかわらず、NeedIndexError を返します。その理由は、バー >= 値に基づく 2 番目のフィルターです。そのフィルターを削除すると、クエリは完璧に機能しますが、目標は達成されません。

Object.query(projection=[Object.foo, Object.bar], distinct=True) \
    .filter(Object.username == user.nickname()) \
    .filter(Object.bar >= value) \
    .fetch()

これは機能しますが、結果は別個の foo だけではなく、foo と bar のデカルト積になります。そもそもそれは私たちが目指していたものではありません。

Object.query() \
    .filter(Object.username == user.nickname()) \
    .filter(Object.bar >= value) \
    .fetch(projection=[Object.foo])

これも機能しますが、「foo」でグループ化する方法がないため、「foo」値が重複するリストが作成されます。

上記のように、この問題には解決策がありますが、どちらも回答リストが大きくなります。できればこれは避けたいです。したがって、2つの質問があります。

  1. filter() のプロパティをプロジェクションに含める必要がある場合があるのはなぜですか? これは私には意味がありません。また、これがより適切なものではなく、NeedIndexError になるのはなぜですか?
  2. 上記の欠点を持たないソリューションはありますか? それとも、間違った側からこの問題に取り組んでいますか? どんなアドバイスでも大歓迎です。
4

1 に答える 1

0

これはインデックス レコメンデーション システムのバグであり、App Engine の 1.8.6 リリースで修正される予定です。問題は、個別のプロパティを提供するために、これらのプロパティを並べ替え順序の最初にする必要があることです。不等式もソート順の最初になければならないことに注意してください。したがって、不等式と個別の射影がある場合、それらは同じプロパティにある必要があります。

プロジェクションがフィルターに含まれている必要がある唯一の理由は、個別のプロパティを要求しているためです。これは、同じプロパティに対する group by によるプロジェクションと考えることができます。このグループ化を行うには、プロパティをソートして効率的な重複排除を行う必要があります。

目的のクエリを実行する唯一の方法は、メモリ内で何らかの操作を実行することです (質問で述べたように)。もう 1 つのオプションは、不等式フィルターを使用せず、メモリ内でこのフィルター処理を行うことです。

1.8.6 SDK にアップグレードすると、より適切な (-ish) エラー メッセージが表示されるようになるはずです。

于 2013-10-24T17:18:02.373 に答える