2

GAE のデータストアを少しいじってみると、多値プロパティで不等式フィルター '!=' を使用して結果をフィルター処理する適切な方法を考えられないことがわかりました。

class Entry(db.Model):
    ...
    tags = db.StringListProperty()

e1 = Entry()
e2 = Entry()
e1.tags = ['tag1', 'tag2', 'tag3']
e2.tags = ['tag1', 'tag3', 'tag4']

# I want to exclude all the results containing 'tag2'
db.GqlQuery("""SELECT * FROM Entry 
               WHERE tags != 'tag2' """)

問題は、このクエリがe1e2の両方を返すことですが、必要なのはe2だけです。

これは、不等式フィルターが ANY (少なくとも 1 つの値が != 'tag2' である場合は TRUE) として評価されるために発生すると思います。ALL にフィルターを適用する方法はありますか? (すべての値が != 'tag2' である場合は TRUE)?

GAE のデータストアがリレーショナルではないことは知っていますが、この種のクエリを巧みに解決/考える方法を知りたいです。

ありがとう ;)

4

1 に答える 1

0

私はこれについてたくさん考えましたが、それを行う良い方法があるとは思いません (間違っている場合は修正してください)。私の賢明ではない解決策は、StringListProperty を使用せず、一連のフィルターをカスケードすることです。

class Entry(db.Model):
  ...
  tag_1 = db.StringProperty();
  tag_2 = db.StringProperty();
  ...
Entry.all().filter('tag_1 !=', tag).filter('tag_2 !=', tag) ...

このソリューションの明白な問題について説明するつもりはありませんが、少なくともあなたが望むことはできます。

于 2011-01-26T16:12:26.567 に答える