1

次のようなモデルがあります。

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()

最初にタグをクエリして、それらを持つエンティティのリストを取得します。

results = Example.all().filter("tags =", tagSearch).fetch(100)

これにより、「タグ」リストに「tagSearch」を含むエンティティのリストが表示されます。

結果エンティティのサンプルは次のようになります。

entityA = [tagSearch, m, n, o, ....]

entityB = [a, b, c, tagSearch, ... ]

entityC = [a, tagSearch, a, ,a ,x ....... ....]

アイテム tagSearch の位置に基づいて、結果セット内のすべてのエンティティを降順で並べ替えたいと思います。

basically - entityA, entityC, entityB 

どうすればいいですか?これをappengineで実行していることに注意してください...

また、tagSearch よりも与えられた仮定は、任意のリストで 1 回だけ発生します。

どんな助けでも大歓迎です。

4

3 に答える 3

2

これを行う唯一の方法は、タグ リストを変更して位置を含め、不等式フィルターを使用することです。たとえば、タグを「tag:ordinal」の形式に変更できます。ここで、ordinal はリスト内の位置です (つまり、entityA は になります["tagSearch:0", "m:1", "n:2", "o:3"])。次に、等価フィルターを実行する代わりに、次のようなクエリを実行します。

results = Example.all().filter("tags >=", tagSearch + u":").filter("tags <", tagSearch + u":\ufffd").fetch(100)

したがって、結果セットは、検索対象のタグがリストに表示される位置によって並べ替えられます。欠点は、一度に 1 つのタグしかクエリできないことです。App Engine では複数の不等式フィルタを使用できません。

于 2010-07-19T13:42:19.900 に答える
1

私の知る限り、クエリでこれらを並べ替えることはできません。したがって、唯一の代替手段は、それらをすべてフェッチし、コード内でそれに応じて並べ替えることです。

これは、返す必要のあるエンティティの数によってはパフォーマンスが低下する可能性があるため、フェッチする前に他の方法でエンティティを制限することをお勧めします。

于 2010-07-14T15:11:28.913 に答える
1

あなたのモデルを考えると、クエリでは実行できないというジェイソン・ホールに同意します。

モデルを次のように変更してみてください。

class Example (db.Model) :
    name = db.StringProperty()

class ExampleTag(db.Model):
    example_id = db.IntegerProperty()
    tag_name = db.StringProperty()
    tag_rank = db.IntegerProperty()

次に、次のようにクエリを実行します。

query = ExampleTag.all()
query.filter('tag_name =', 'tagSearch')
query.order('tag_rank')
tags = query.fetch(100)

examples = Example.get_by_ids([x.example_id for x in tags])
于 2010-07-14T18:00:30.977 に答える