【发布时间】:2014-11-26 09:46:27
【问题描述】:
我遇到了一个非常基本的问题,即根据简单的 WHERE <column> = 'xxx' 类型查询从 Datastore Viewer 控制台查询我的数据。
这是我的虚拟数据的快照:
据我了解,我应该能够使用SELECT * FROM User WHERE email = 'a' 根据“电子邮件”字段或任何其他字段查询该记录。但这会返回“在空命名空间中没有结果”。如下图所示:
我看不出与这个相关问题的情况有什么不同:
我在实体编辑器中检查了该记录,可以确认电子邮件字段的值为“a”,没有任何额外的隐藏空格:
更新
Mihail suggested 我需要为此查询创建索引。
按照Java Datastore Index Configuration docs,我在/war/WEB-INF中创建了文件datastore-indexes.xml:
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="false">
<datastore-index kind="User" ancestor="false">
<property name="email" direction="asc" />
</datastore-index>
</datastore-indexes>
我无法部署我的项目,因为它不允许上传此索引。我得到的错误信息是:
为 entity_type: "User"ancestor 创建复合索引失败: falseProperty { 名称:“电子邮件”方向:1}:此索引:实体类型: “用户”祖先:falseProperty {名称:“电子邮件”方向:1}不是 必要的,因为内置了单一属性索引。请删除 它从您的索引文件中升级到最新版本的 SDK, 如果你还没有。
【问题讨论】:
-
电子邮件属性是否已编入索引?当属性没有被索引时,它将像您描述的那样工作。
-
@MihailR 它确实看起来像一个索引问题......但出于我个人的好奇心,为什么错误不会像通常在这些情况下那样是“需要索引”?
-
假设您使用的是 NDB(或任何其他 Datastore 库) - 这就是处理“需要索引”异常的原因。数据存储本身没有。您甚至可以拼错属性名称(即
email123而不是email),但仍然不会出错。
标签: google-app-engine gql