Appengine 过滤器不等式和排序失败

Posted

技术标签:

【中文标题】Appengine 过滤器不等式和排序失败【英文标题】:Appengine filter inequality and ordering fails 【发布时间】:2011-02-09 22:11:42 【问题描述】:

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

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

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

嗯?我错过了什么?

谢谢。

【问题讨论】:

【参考方案1】:

数据存储无法通过不等式中使用的属性以外的任何属性对包含不等式的查询进行排序。

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

【讨论】:

谢谢。如果我的所有请求都只需要 10 秒,我怎么能写一些东西来更新我的整个数据存储? 30 秒,而不是 10 秒,您可以使用如下内容:blog.notdot.net/2010/03/… 尼克:这看起来非常非常有用。非常感谢。 如果您希望有人解决此问题,请为该错误加注星标:code.google.com/p/googleappengine/issues/detail?id=3228【参考方案2】:

我使用了另一个技巧,这仅仅是因为我需要数据的格式(字典列表)。在这种情况下,我运行基于日期时间的查询,从返回的 ents 创建字典,然后按数字“计数器”属性排序。颠倒排序给了我一个降序。请记住,我只在一个相当小的数据存储上请求了 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】:

Datastore 对查询有一些限制。一个是不允许将一个属性上的不等式过滤器与另一个属性上的顺序结合起来。您可以在此处找到更多限制:

https://cloud.google.com/appengine/docs/python/ndb/queries

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

我不知道从什么时候开始,但当前的 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-02-08 编辑:正如 Horselover Fat 在评论中提到的那样,它只是避免了一个错误。

【讨论】:

这避免了运行时错误,但它并没有做你想要的! (无论如何都在db 中测试过) - 它只返回按submitted 排序的查询! 是的,你是对的。当我写下答案时,我认为它确实有效。

以上是关于Appengine 过滤器不等式和排序失败的主要内容,如果未能解决你的问题,请参考以下文章

App Engine - 为邻近搜索预先计算边界框

排序不等式

9.30T1 排序不等式+逆元

使用谷歌应用引擎索引营业时间

合并长度不等的排序数组

遗传算法能否解决同时包含整数约束和等式约束的优化问题?