数据存储查看器控制台中的GQL基本查询返回"没有结果为空命名空间。"

时间:2014-10-01 14:03:59

标签: google-app-engine gql

我遇到了一个非常基本的问题,即根据简单的WHERE <column> = 'xxx'类型查询从Datastore Viewer控制台查询我的数据。

以下是我的虚拟数据的快照:

enter image description here


根据我的理解,我应该可以使用SELECT * FROM User WHERE email = 'a'根据“电子邮件”字段或任何其他字段查询该记录。但是返回“空命名空间中没有结果”。如下所示:

enter image description here


我没有看到这个相关问题的情况有什么不同:

我在实体编辑器中检查了该记录,并且可以确认电子邮件字段的值是“a”,没有任何额外的隐藏空格:

enter image description here


更新

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 {name:“email”方向:1}:此索引:entity_type:   “用户”祖先:falseProperty {name:“email”方向:1}不是   必要的,因为内置了单一财产指标。请删除   它从您的索引文件中升级到最新版本的SDK,   如果你还没有。

1 个答案:

答案 0 :(得分:2)

听起来email属性没有编入索引,你也无法对未编入索引的属性进行任何查询,就像这个一样简单,因为如果你有百万用户,那么这个查询就必须获取百万实体找到你需要的实体。

您需要做的就是将email属性编入索引,但请注意,它不会处理过去的实体。您将需要重新保存所有过去的实体,以便应用新索引。

将属性编入索引

  • 在Objectify中,需要将@Index注释添加到属性中。 More details here

  • 如果使用低级Java数据存储区API,请确保使用setProperty()而非setUnindexedProperty()定义属性。 More details here

  • 如果使用Python的NDB,请确保indexed属性未设置为False,因为默认情况下会对大多数属性编制索引。 More details here