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 将在任何列表中仅出现一次。

任何帮助将不胜感激。

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)

因此,结果集将按照搜索标签出现在列表中的位置进行排序。缺点是您现在一次只能查询一个标签 - App Engine 中无法使用多个不等式过滤器。

于 2010-07-19T13:42:19.900 回答
1

据我所知,您将无法在查询中对这些内容进行排序。因此,唯一的选择是全部获取它们并在您的代码中对它们进行相应的排序。

根据您必须返回的实体数量,这可能无法实现高性能,因此您可能希望在获取之前以其他方式限制实体。

于 2010-07-14T15:11:28.913 回答
1

我同意 Jason Hall 的观点,即考虑到您的模型,查询将无法实现。

您可以尝试将模型更改为以下内容:

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 回答