Home > GAE和编程 > Google App Engine对查询的限制

Google App Engine对查询的限制

October 1st, 2010 发表评论 阅读评论

今天我在GAE进行数据查询时遇到了这样一个异常:First ordering property must be the same as inequality filter property, if specified for this query; received date, expected ctype 。到网络上搜索一下,发现这是Google App Engine对查询上的一个限制。经过一会儿时间的查找,我终于在在Google App Engine上查到该查询限制及其解决办法,办法就是“必须在采用其他排序顺序之前对不等式过滤器中的属性进行排序”。

下面记录一些Google App Engine查询机制的限制,以方便后期参考。索引查询机制的本质是对查询功能强加一些限制。

对一个属性进行过滤或排序需要确认该属性确实存在

属性的查询过滤条件或排序顺序也暗含了一个条件,即实体必须具有该属性的值。

数据存储区实体不需具有其他同类实体所具有的属性值。属性上的过滤器只能与具有该属性的值的实体相匹配。过滤器或排序顺序中所使用的不具有属性值的实体会从为该查询创建的索引中删除。

没有可与不具有属性的实体相匹配的过滤器

无法为缺少指定属性的实体执行查询。一种解决方法是创建一个固定的(已建模的)属性,默认值为 None,然后为实体创建一个过滤条件,属性值为 None

不等式过滤条件只能用于一个属性

查询在其所有过滤器中只能在一个属性上使用不等式过滤条件(<<=>=>!=)。

例如,以下查询是允许使用的:

SELECT * FROM Person WHERE birth_year >= :min
                       AND birth_year <= :max

而以下查询是不允许使用,因为此查询在同一个查询中的两个不同属性上使用了不等式过滤条件:

SELECT * FROM Person WHERE birth_year >= :min_year
                       AND height >= :min_height     # ERROR

过滤器可合并同一查询(包括属性上带有一个或多个不等式条件的查询)中不同属性的同级 (=) 比较。允许执行此操作:

SELECT * FROM Person WHERE last_name = :last_name
                       AND city = :city
                       AND birth_year >= :min_year

查询机制基于将查询的所有结果彼此相邻地排列在索引表中,以避免为查找结果而不得不扫描整个整个表。在保持所有结果连续出现在表中的同时,单个索引表无法表示用于多个属性上的多个不等式过滤器。

必须在采用其他排序顺序之前对不等式过滤器中的属性进行排序

如果查询具有带不等式比较以及带一个或多个排序顺序的两种过滤器,那么,该查询必须包含在该不等式中使用的属性的排序顺序,且该排序顺序必须出现在其他属性上的排序顺序之前。

以下查询无效,因为此查询使用了不等式过滤条件,且未根据已过滤的属性进行排序:

SELECT * FROM Person WHERE birth_year >= :min_year
                     ORDER BY last_name              # ERROR

同样,以下查询无效,因为它在根据其他属性排序之前未根据已过滤的属性进行排序:

SELECT * FROM Person WHERE birth_year >= :min_year
                     ORDER BY last_name, birth_year  # ERROR

以下查询有效:

SELECT * FROM Person WHERE birth_year >= :min_year
                     ORDER BY birth_year, last_name

要获得与不等式过滤条件匹配的所有结果,查询会扫描索引表寻找第一个匹配的行,然后返回所有连续的匹配结果,直到找到不匹配的行为止。表示完整结果集的连续行必须先按照不等式过滤条件排序,然后再按其他顺序排序。

排序顺序和具有多个值的属性

鉴于将具有多个值的属性编入索引的方式,这些属性的排序顺序不平常:

  • 如果实体按照多值属性以升序排列,则用于排序的值会成为最小的值。
  • 如果实体按照多值属性以降序排列,则用于排序的值会成为最大的值。
  • 其他值不影响排序顺序,值的数目也不影响。
  • 就链而言,该实体的键被用作该链的断路器。

此排序顺序引起异常结果:以升序和降序排序时 [1, 9] 都显示在 [4, 5, 6, 7] 之前。

需要特别注意对于多值属性既具有等式过滤条件又具有排序顺序的查询。在这些查询中,排序顺序将被忽略。对于单值属性,这是一个简单的优化。对于属性来说,每个结果都具有相同的值,因此,不需要对结果进一步排序。

然而,多值属性可能具有其他的值。由于忽略了排序顺序,与应用了排序顺序时相比,可能会以一个不同于前者顺序的顺序返回查询结果。(恢复已放弃的排序顺序会花费巨大并需要额外的标记,又因为这种使用情况很少出现,因此查询计划员禁止此项操作。)

转载请以超链接注明来自  云在天边看世界
本文永久链接  http://www.tangblog.info/2010/10/1/restrictions-on-queries-of-google-app-engine.html

分类: GAE和编程 标签: ,

  1. avatar
    guest 2010-12-07 at 13:43 |#35

    看来细节问题也很重要。谢谢小天啦。
  2. avatar
    guest 2010-12-01 at 11:09 |#34

    这些专业知识,需要慢慢消化。
  3. avatar
    云在天边 2010-10-20 at 21:46 |#33

    @Lambert
    工作找到了啊?
  4. avatar
    上海长江医院 2010-10-20 at 16:58 |#32

    看不懂喔!
  5. avatar
    Lambert 2010-10-19 at 12:23 |#31

    好久没来你这里了
  6. avatar
    七七 2010-10-18 at 17:40 |#30

    嗯,不懂的过来关注下!
  7. avatar
    云在天边 2010-10-17 at 22:02 |#29

    @鸣
    使用类似do/getcomments的方法,专门添加一页来处理评论就行啦
  8. avatar
    云在天边 2010-10-17 at 21:59 |#28

    @Mucid
    我现在还在URL 301中,全站都没缓存,呵呵。
    有时间的话,我准备新建一个App,专门用来缓存头像,哈哈
  9. avatar
    2010-10-17 at 19:35 |#27

    无刷的评论分页, nice
  10. avatar
    Mucid 2010-10-17 at 19:19 |#26

    看你也没有用缓存////
  11. avatar
    云在天边 2010-10-10 at 14:26 |#25

    @Angel
    嗯,是无刷新的,我的评论分页也是的,不过没那个效果
  12. avatar
    云在天边 2010-10-10 at 14:25 |#24

    @实木家具
    o(∩_∩)o 哈哈,电子商务不错啊
  13. avatar
    Angel 2010-10-10 at 08:14 |#23

    @云在天边
    哦。。看到了,,他那个分页貌似用了无刷新啊。。。等我有时间看看。。
  14. avatar
    实木家具 2010-10-09 at 23:35 |#22

    @云在天边
    唉,我不是卖家具的,只是做个家具网站试试电子商务的……
  15. avatar
    云在天边 2010-10-09 at 22:18 |#21

    @Angel
    我是说PhilNa2主题的自带js,有分页下滑的效果,我还没分析出来咋写的,作者网站上有这个效果,你去看看
  16. avatar
    Angel 2010-10-09 at 22:06 |#20

    @云在天边
    今晚刚更新上;额,,你说的评论分页样式是哪个主题??iStudio 还是 PhilNa2 ?
  17. avatar
    云在天边 2010-10-09 at 21:42 |#19

    @Angel
    都用上Chrome 8.0了
  18. avatar
    Angel 2010-10-09 at 21:41 |#18

    额。。。没有遇到过这样的case。。。
  19. avatar
    小杰 2010-10-09 at 21:09 |#17

    原来这样啊,学习~~
  20. avatar
    云在天边 2010-10-09 at 19:11 |#16

    @实木家具
    卖家具的不用了解这些啦
Comment pages 12»
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
/static/smilies/icon_twisted.gif /static/smilies/icon_smile.gif /static/smilies/icon_cry.gif /static/smilies/icon_question.gif /static/smilies/icon_razz.gif /static/smilies/icon_mrgreen.gif /static/smilies/icon_sad.gif /static/smilies/icon_evil.gif /static/smilies/icon_exclaim.gif /static/smilies/icon_redface.gif /static/smilies/icon_biggrin.gif /static/smilies/icon_surprised.gif /static/smilies/icon_eek.gif /static/smilies/icon_confused.gif /static/smilies/icon_cool.gif /static/smilies/icon_lol.gif /static/smilies/icon_mad.gif /static/smilies/icon_rolleyes.gif /static/smilies/icon_wink.gif /static/smilies/icon_idea.gif /static/smilies/icon_arrow.gif /static/smilies/icon_neutral.gif
capacha 请输入验证码(不区分大小写)