Google app engine 根据元素在app engine中的位置对StringListProperty进行排序

Google app engine 根据元素在app engine中的位置对StringListProperty进行排序,google-app-engine,sorting,google-cloud-datastore,listproperty,Google App Engine,Sorting,Google Cloud Datastore,Listproperty,我有这样的模型: class Example (db.Model) : name = db.StringProperty() tags = db.StringListProperty() class Example (db.Model) : name = db.StringProperty() class ExampleTag(db.Model): example_id = db.IntegerProperty() tag_name = db.StringProp

我有这样的模型:

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()
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])
我首先查询一个标记,以获取包含它们的实体列表:

results = Example.all().filter("tags =", tagSearch).fetch(100)
这为我提供了一个实体列表,其中包含其“标记”列表中的“标记搜索”

以下是结果实体的示例:

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

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

entityC = [a, tagSearch, a, ,a ,x ....... ....]
我想根据项目标记搜索在结果集中的位置,按降序对结果集中的所有实体进行排序

basically - entityA, entityC, entityB 
我该怎么做?注意,我正在appengine上运行此

此外,假设给定的tagSearch在任何列表中只出现一次


我们将非常感谢您的帮助

据我所知,您将无法在查询中对这些进行排序。因此,唯一的替代方法是将它们全部提取出来,并在代码中对它们进行相应的排序


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

据我所知,您将无法在查询中对这些实体进行排序。因此,唯一的替代方法是将它们全部提取出来,并在代码中对它们进行相应的排序


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

我同意Jason Hall的观点,即根据您的模型,查询是不可行的

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

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()
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])
然后按如下方式运行查询:

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()
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])

我同意Jason Hall的观点,即根据您的模型,使用查询是不可行的

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

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()
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])
然后按如下方式运行查询:

class Example (db.Model) :
 name = db.StringProperty()
 tags = db.StringListProperty()
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])

我能想到的唯一方法是修改标记列表以包含位置,并使用不平等过滤器。例如,您可以将标记修改为“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)

results=Example.all().filter(“tags>=”,tagSearch+u):).filter(“tags我能想到的唯一方法是修改标记列表以包含位置,并使用一个不平等过滤器。例如,您可以将标记修改为“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)

results=Example.all().filter(“tags>=”,tagSearch+u):).filter(“标签问题是,我必须同时对所有检索到的条目运行此算法,以获得正确的结果集。但这不是我在这里引用的一个真正常见的问题吗?这是一个标准排序问题。如果app engine无法解决这样一个常见的问题,那将是令人震惊的。对我来说,这听起来不是一个非常常见的问题。你会怎么做在SQL中执行此操作--你会说SQL无法通过不简化此操作来交付吗?问题是我必须同时对所有检索到的条目运行此算法以获得正确的结果集。但这不是我在这里引用的一个真正常见的问题吗?这是一个标准排序问题。如果app engine无法在这样的com上交付,那将令人震惊一个问题。对我来说,这听起来不是一个很常见的问题。你会如何在SQL中做到这一点——你会说SQL没有做到这一点吗?这个解决方案只有在他只对单个标记进行排序时才有效(例如,“thistag”但从来没有“thattag”)!这个解决方案只有在他只对单个标记进行排序时才有效(例如,“thistag”而不是“thattag”)!