带过滤器的AppEngine数据存储区查询永远不会返回结果(转到)

时间:2016-08-08 12:38:59

标签: google-app-engine go google-cloud-datastore

如果我不使用过滤器,我会得到结果。如果我使用过滤器(此记录肯定存在),我不会得到任何结果。可能缺少为该属性定义的索引,但是,据我所知,应该在开发服务器中自动创建简单索引(以及使用它创建并填充的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的截图:

Screenshot of Viewer

2 个答案:

答案 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)。

  •