【问题标题】:Is there a maximum size for index numbers in Google DatastoreGoogle Datastore 中的索引号是否有最大大小
【发布时间】:2015-01-09 17:08:26
【问题描述】:

我有一个应用程序在 Google Datastore 中存储和索引数字字段。在内部,这些是使用 Java/Objectify 创建和索引的,实体被持久化,并为我们希望搜索的字段添加了 @Index 注释......

@Index
private Long fieldOne;

@Index
private Long fieldTwo;

在我尝试使用这些索引字段搜索实体之前,一切正常。 fieldOne 的值为 5709068098338816 并使用 GQL 进行搜索:

SELECT * 
FROM MyEntity
WHERE fieldOne = 5709068098338816

但是,fieldTwo 的值为3572054303678568400,这就是我的问题开始的地方。出于某种原因,我无法在 GQL 中使用此值或使用 objectify 进行搜索。即使我可以在 google 数据存储中看到该值,以下 GQL 也不会返回任何结果:

SELECT * 
FROM MyEntity
WHERE fieldTwo = 3572054303678568400

我可以看到它在 Google 数据存储中存储和索引。

我的问题是,Google 数据存储区中索引数字的大小是否有限制?这个值是否可能以某种方式太大而无法正确索引,或者我可能完全错过了其他东西?这个值低于最大的 Long 值,所以我不确定发生了什么。

任何帮助将不胜感激。 干杯!

【问题讨论】:

    标签: google-app-engine objectify google-cloud-datastore gql


    【解决方案1】:

    这可能是由于您的 fieldTwo 长度超过 16 位。 App Engine 数据存储区可以对主键使用 Long 值 - 但在下面链接的文档中 - 它指出:

    每个 ID 最多可以有 16 位十进制数字。

    您的字段不是主键,但我猜它在被索引时遵循与 Long PrimaryKey 相同的模式。

    https://cloud.google.com/appengine/docs/java/datastore/entities

    【讨论】:

    • 您误读了文档。它表示生成器生成的 ID 最长为 16 位。它并没有说 Long 主键不能比这更长。其实我们知道是可以的——生成器之所以有这个限制,是因为第一版的分散生成器没有这个限制,当大量传给很多Javascript应用的时候会导致失败。
    • 感谢您的澄清。我现在记得他们第一次切换到分散发电机时的那些失败。我注意到上面的值的第一件事是一个超过 16 位数字,我认为这可能是原因。
    【解决方案2】:

    我想我已经设法找出问题所在。似乎在使用 App Engine 控制台时,由于某种原因,为这些长实体的值返回了错误的值。我能够使用新的应用引擎控制台复制它...

    我有一个名为 FooBar 的实体,它有一个名为 fieldTwo 的索引属性。如果我想通过新的 App Engine 界面搜索所有 fieldTwo 值为 3032316359359434752 的 FooBars,它会产生类似的请求。

    "https://console.developers.google.com/m/datastore/entities?filters="%"5B"%"7B"%"22property"%"22:"%"22fieldTwo"%"22,"%"22type"%"22:"%"22number"%"22,"%"22operator"%"22:"%"22equal"%"22,"%"22value"%"22:"%"223032316359359434752"%"22"%"7D"%"5D&kind=FooBar&namespace=&pid=some-id"

    问题是这个请求的结果。该请求似乎返回了正确的实体,但是,返回的实体中 fieldTwo 的值不正确。上一个请求的结果是……

    {
        "tos": [],
        "cursor": "E-ABAIICQ2oMc35mb29kaXQtZGV2cjMLEg1PcmRlckZlZWRiYWNrGICAgPyq8IQIDAsSDE1lYWxGZWVkYmFjaxiAgICAgK6ZCgyIAgAU",
        "results": [
            {
                "properties": [
                    // some properties removed
                    {
                        "indexed": true,
                        "name": "fieldTwo",
                        "value": 3032316359359435000,
                        "type": "number"
                    },
                    // some properties removed
                ],
                "key": {
                    "label": "5629499534213120",
                    "object": "FooBar id:5629499534213120",
                    "type": "id"
                }
            }
        ],
        "status": 0
    }
    

    如您所见,fieldTwo 的值不正确。当它应该是3032316359359434752 时,它是3032316359359435000。这是从服务器返回的内容,所以我认为这不是 Javascript 问题,因为当对此查询发出 cURL 请求时,服务器返回的值不正确。

    目前我倾向于这是 Google 数据存储区中的一个错误。

    已编辑

    Google 回复我并确认这确实是数据存储界面中的错误。它已经被修复了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2020-01-16
      • 2018-04-29
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多