Appengine筛选器不等式和排序失败

24

我觉得我在这里忽略了一些简单的东西,我无法想象这是不可能做到的。

我想通过一个日期时间属性进行过滤,然后按排名整数属性对结果进行排序。 当我尝试这样做时:

query.filter("submitted >=" thisweek).order("ranking")

我得到了以下内容:

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received ranking, expected submitted

嗯?我错过了什么吗?

谢谢。

5个回答

20

数据存储库无法对包含不等式的查询按除不等式所用属性以外的任何属性进行排序。

通常可以通过添加一个可使用相等性过滤的属性来解决此问题;在这种情况下,可能可以使用BooleanProperty来跟踪实体是否来自当前周,并在每周结束时为所有实体更新它。


谢谢。如果我的所有请求都必须在10秒内完成,我该如何编写代码以更新整个数据存储? - dave paola
1
30秒,而不是10秒,您可以使用类似于此的东西:http://blog.notdot.net/2010/03/Announcing-a-robust-datastore-bulk-update-utility-for-App-Engine - Nick Johnson
1
如果你想让别人来解决这个问题,请给这个bug打星: http://code.google.com/p/googleappengine/issues/detail?id=3228 - speedplane

3

我使用了另一个技巧,因为我需要的数据格式是一个字典列表。在这种情况下,我运行基于日期时间的查询,从返回的结果中创建字典,然后按数字计数器属性排序。反向排序给我一个降序。请记住,我只请求了10个结果,在一个相当小的数据存储中。

q = food.Food.all()
q.filter("last_modified <=", now)
q.filter("last_modified >=", hour_ago)

ents = q.fetch(10)

if ents:
  results = [{
    "name": ent.name,
    "counter": ent.counter
    } for ent in ents]

  # reverse list for 'descending' order
  results.sort(reverse=True)

例子结果:

[{'counter': 111L, 'name': u'wasabi'}, {'counter': 51L, 'name': u'honeydew'}, {'counter': 43L, 'name': u'mars bar'}, {'counter': 37L, 'name': u'scallop'}, {'counter': 33L, 'name': u'turnip'}, {'counter': 29L, 'name': u'cornbread'}, {'counter': 16L, 'name': u'mackerel'}, {'counter': 10L, 'name': u'instant coffee'}, {'counter': 3L, 'name': u'brussel sprouts'}, {'counter': 2L, 'name': u'anchovies'}]

3

-1

我不知道从什么时候开始,但当前的SDK可能会返回微妙的不同错误:

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received ranking, expected submitted

在我的情况下,我可以通过以下方式解决这个错误:
query.filter("submitted >=" thisweek).order("submitted").order("ranking")

编辑于2013年2月8日:正如Horselover Fat在评论中提到的那样,它只是避免了一个错误。


5
这样可以避免运行时错误,但它并不能实现你想要的效果!(无论在db中是否测试过)它只是简单地按submitted对查询结果进行排序返回! - HorseloverFat
是的,你说得对。当我写下这个答案时,我认为它是有效的。 - hiroshi

-1

最简单的方法是将您的查询拆分:

q1 = query.filter("submitted >=" thisweek)
q2 = q1.order("ranking")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接