0

NDB データストアは、異なるプロパティに対する複数の不等式クエリを禁止しています。これを回避するには、複数の独立したクエリの結果を組み合わせることが解決策になるのではないかと考えました。私がよく知らないジオハッシュを推奨するこの2011年の質問を見つけました。したがって、おそらく今日はより良い解決策があります。

次の 2 つのクエリを検討してください。

q1 = User.query(User.age < 18).fetch()
q2 = User.query(User.city != 'New York City').fetch()

私は次のようにそれらに参加しようとします:

results = set(q1).intersection(q2)

しかし、私は遭遇しTypeError: Model is not immutableます。

私の質問:

  • 異なるプロパティで複数の不等式フィルターを処理するより良い方法はありますか?
  • そうでない場合、どうすればTypeError上記を解決できますか?

助けてくれてありがとう。

4

3 に答える 3

2

モデルを再構築できる場合はUser、いくつかのプロパティを追加して、クエリをより簡単にすることができます。たとえば、同じ年齢範囲でクエリを実行する場合、範囲をエンコードするプロパティを作成します。

age_range = ndb.IntegerProperty()    # 0 = 0-17, 1 = 18-29, 2 = 30-39, etc.

次に、次のことができます。

q1 = User.query(User.age_range == 0).query(User.city != 'New York City').fetch()

データセットが十分に小さい場合は、@ TimHoffman のアプローチを使用できます。

q1 = User.query(User.age < 18).fetch(keys_only=True)
q2 = User.query(User.city != 'New York City').fetch(keys_only=True)
results = ndb.get_multi(set(q1).intersection(q2))

ビッグ データ セットにスケールアップするより重いアプローチは、MapReduceライブラリです。複数のフィルターを配置して、データ セットを減らすことができます。

于 2015-11-06T18:16:11.193 に答える
0

同様の問題がありました。私のクエリは次のとおりです。

@classmethod:
def getUnReadMessages(cls, user, date)
    return cls.query(ndb.AND(cls.created <= date,
                             cls.receiver_key == user.key,
                             cls.status != READ))

しかし、appengine は私にそれをさせませんでした。そこで、1 つの不等式を次のように変更して解決しました。

@classmethod:
def getUnReadMessages(cls, user, date)
    return cls.query(ndb.AND(cls.created <= date,
                             cls.receiver_key == user.key,
                             ndb.OR(cls.status == SEND,
                                    cls.status == RECEIVED)))

問題が解決しました!これがお役に立てば幸いです。

于 2016-03-31T13:47:49.800 に答える