基于app引擎中元素的位置对StringListProperty进行排序

时间:2010-07-14 13:45:02

标签: google-app-engine sorting google-cloud-datastore listproperty

我的模型看起来像这样:

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

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分: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中无法使用多个不等式过滤器。

答案 1 :(得分:1)

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

这可能不太可行,具体取决于您必须返回的实体数量,因此您可能希望在获取之前以其他方式限制实体。

答案 2 :(得分: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])