GAE / J范围查询中可能的最高键字符串是什么?

时间:2011-04-09 20:23:26

标签: java google-app-engine google-cloud-datastore

Google应用引擎上的关键空间结构如下 香蕉a3fadawsgdg 香蕉hrgsgsgsdgs 香蕉regsgsdgsgg 番茄fsfg33424ff 番茄dsfgsgasdgs

即。有一个类型和一个独特的部分编码成一个字符串(不是这不是GAE类型,它是我们组成的类型)。 现在的问题是如何使用GAE范围查询检索所有banana -......键。

为此我需要尽可能低的键,可能是'banana-00000000000'和最高的键,也许'bananna-zzzzzzzzzz'。但是,由于存在unicode,因此可能必须使用更加有趣的代码点。并且,由于这是一个引人注目的问题,因此请求而不是盲目地尝试。

2 个答案:

答案 0 :(得分:3)

您可能不需要知道最高密钥。

对于范围查询,您可以使用banana.作为上限(.是紧跟在-之后的ASCII / unicode字符。)

如果你确实需要知道最高可能的密钥,那么首先它取决于第二部分允许的字符数(如果它是变量然后选择它可能的最大数字),那么IIRC 0xFFFF可以合法地出现在UCS-2中/ UTF-16,但不是定义的代码点,因此可能会被拒绝。所以试试而不是z,如果它有效,那么它就可以了。失败的U+FFFD(替换字符)可能足够接近BMP的顶部,因为故意取消分配U+FFFE以便BOM U+FEFF可用于指示字节序。

我不知道数据存储区是否/如何处理密钥字符串比较中的非BMP代码点。

答案 1 :(得分:1)

不确定它在Java中的外观,但在GQL / python中:

gql = "SELECT * FROM MyObj WHERE __key__ >= Key('MyObj', :1) " + \
    "AND __key__ <= Key('MyObj', :2)"
query = db.GqlQuery(gql, 'banana-', u'banana-' + u'\ufffd')

会将banana-banana-Z...Z匹配(然后再匹配一些)。

我更有可能使用filter syntax