如果我不使用过滤器,我会得到结果。如果我使用过滤器(此记录肯定存在),我不会得到任何结果。可能缺少为该属性定义的索引,但是,据我所知,应该在开发服务器中自动创建简单索引(以及使用它创建并填充的index.yaml文件)。这种情况没有发生。
query = datastore.NewQuery("UserAccount").Filter("email =", "test@example.com")
ua := UserAccount{}
t := query.Run(ctx)
for ; ; {
if _, err = t.Next(&ua); err == nil {
log.Debugf(ctx, "Current: %s", ua)
} else if err == datastore.Done {
break
} else {
panic(err)
}
}
当开发服务器终止时,它会声明它保存搜索索引":
INFO 2016-08-08 05:09:52,894 api_server.py:651] Saving search indexes
然而,因为" index.yaml"文件没有显示,我假设不需要创建索引,这意味着我的查询必须没有达到预期效果?
我错过了什么?
编辑:
请注意,之前已创建记录,并且应用程序已停止并多次启动。我真诚地怀疑这是最终的一致性。
编辑2:
出于测试目的,我使用以下代码创建了以下模型。它们都表现出与原始模型和代码相同的行为。
定义:
type TestEntity struct {
Email string
}
代码:
log.Debugf(ctx, "Putting.")
email := "anothertest@a.b"
te := &TestEntity{
Email: email,
}
k := datastore.NewKey(ctx, "TestEntity", "123", 0, nil)
_, err = datastore.Put(ctx, k, te)
if err != nil {
panic(err)
}
log.Debugf(ctx, "Waiting.")
time.Sleep(1 * time.Second)
query := datastore.NewQuery("TestEntity")
var results []TestEntity
_, err = query.GetAll(ctx, &results)
log.Debugf(ctx, "GetAll: %s", results)
log.Debugf(ctx, "Running query.")
query = datastore.NewQuery("TestEntity").Filter("email =", email)
te = &TestEntity{}
t := query.Run(ctx)
for ; ; {
if _, err = t.Next(te); err == nil {
log.Debugf(ctx, "Found: [%s]", te.Email)
} else if err == datastore.Done {
log.Debugf(ctx, "Done.")
break
} else {
panic(err)
}
}
结果:
2016/08/09 02:11:36 DEBUG: Putting.
2016/08/09 02:11:36 DEBUG: Waiting.
2016/08/09 02:11:37 DEBUG: GetAll: [{anothertest@a.b}]
2016/08/09 02:11:37 DEBUG: Running query.
2016/08/09 02:11:37 DEBUG: Done.
Viewer的截图:
答案 0 :(得分:3)
数据存储区中的属性名称为"Email"
,大写字母为E,而不是"email"
。
它区分大小写,必须用大写E来查询:
query = datastore.NewQuery("UserAccount").Filter("Email =", "test@example.com")
如果您希望使用小e
保存/检索它,可以使用tags进行映射,例如:
type UserAccount struct {
Email string `datastore:"email"`
// other fields...
}
答案 1 :(得分:0)
能够通过属性必须在创建实体时启用了索引(在模型定义中)的属性在查询/过滤器的结果中查找实体,并且必须为它完成数据存储区的后台索引任务。
如果您在创建实体之后为该属性启用了索引,则需要重新编写该属性,以便为其触发索引任务,请参阅:https://stackoverflow.com/a/34583510/4495081。
"保存搜索索引"消息是在操作发生之前打印的通用消息,它并不意味着操作的结果将是非空的。
您不必担心您的index.yaml
文件为空。并非所有索引都必须存在于index.yaml
文件中,只需要更复杂/复合的索引。可以使用内置索引匹配您的过滤器(在满足上述索引要求之后)。来自Indexes:
索引有两种类型:
内置索引
默认情况下,Cloud Datastore会自动为每种实体类型的每个属性预定义索引。这些单一属性索引是 适用于简单类型的查询。
复合索引
复合索引为每个索引实体索引多个属性值。复合索引支持复杂查询,并在中定义 索引配置文件(index.yaml)。