我遇到了一个非常基本的问题,即根据简单的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 {name:“email”方向:1}:此索引:entity_type: “用户”祖先:falseProperty {name:“email”方向:1}不是 必要的,因为内置了单一财产指标。请删除 它从您的索引文件中升级到最新版本的SDK, 如果你还没有。
答案 0 :(得分:2)
听起来email
属性没有编入索引,你也无法对未编入索引的属性进行任何查询,就像这个一样简单,因为如果你有百万用户,那么这个查询就必须获取百万实体找到你需要的实体。
您需要做的就是将email
属性编入索引,但请注意,它不会处理过去的实体。您将需要重新保存所有过去的实体,以便应用新索引。
将属性编入索引:
在Objectify中,需要将@Index
注释添加到属性中。 More details here
如果使用低级Java数据存储区API,请确保使用setProperty()
而非setUnindexedProperty()
定义属性。 More details here
如果使用Python的NDB,请确保indexed
属性未设置为False
,因为默认情况下会对大多数属性编制索引。 More details here