我有一个应用程序,用于存储和索引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 datastore中看到该值,以下GQL也不会返回结果:
SELECT *
FROM MyEntity
WHERE fieldTwo = 3572054303678568400
我可以看到这是在Google数据存储区中存储和索引的。
我的问题是,Google Datastore中索引号码的大小是否有限制?这个值是否可能以某种方式大到正确索引或者我是否完全错过了其他内容?此值低于最大Long值,因此我不确定发生了什么。
非常感谢任何帮助。 干杯!
答案 0 :(得分:1)
这可能是由于你的fieldTwo超过16位数。 App Engine数据存储区可以对主键使用Long值 - 但在下面链接的文档中 - 它指出:
每个ID最长可达16位十进制数。
您的字段不是主键,但我猜它在索引时遵循与Long PrimaryKey相同的模式。
https://cloud.google.com/appengine/docs/java/datastore/entities
答案 1 :(得分:1)
我想我已经设法找出问题所在。看来,在使用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的值不正确。它应为3032316359359435000
3032316359359434752
。这是从服务器返回的内容,因此我不认为这是一个Javascript问题,因为当对此查询发出cURL请求时,不正确的值将从服务器返回。
目前,我倾向于将此视为Google数据存储区中的错误。
<强>被修改强>
Google回复了我并确认这确实是数据存储区界面中的一个错误。它已被修复。