Google 数据存储中的索引号是否有最大大小

Is there a maximum size for index numbers in Google Datastore

我有一个应用程序在 Google 数据存储中存储和索引数字字段。在内部,这些是使用 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 returns 没有结果:

SELECT * 
FROM MyEntity
WHERE fieldTwo = 3572054303678568400

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

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

如有任何帮助,我们将不胜感激。 干杯!

这可能是因为您的 fieldTwo 长度超过 16 位。 App Engine Datastore 可以为主键使用 Long 值 - 但在下面链接的文档中 - 它指出:

Each ID can be up to 16 decimal digits long.

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

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

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

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

"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 回复我并确认这确实是数据存储界面中的错误。它已被修复。