在查询相同类型的根和子实体时,数据存储区是否需要指定祖先?

时间:2014-03-20 23:41:47

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

例如,从提供的appengine-angular-gotodos中获取以下代码段:

func getAllTodos(c appengine.Context) ([]Todo, error) {
    todos := []Todo{}
    ks, err := datastore.NewQuery("Todo").Ancestor(defaultTodoList(c)).Order("Created").GetAll(c, &todos)
    if err != nil {
        return nil, err
    }
    for i := 0; i < len(todos); i++ {
        todos[i].Id = ks[i].IntID()
    }
    return todos, nil
}

如果您将查询更改为不包含.Ancestor(defaultTodoList(c)).,则该函数无法返回任何待办结果。

  • 如果实体是用祖先保存的,那么您是否必须通过该祖先进行查询?
  • 如何查询实体,无论它们是子项还是根实体?
  • 在建模我的应用程序时,我应该考虑哪些性能和体系结构考虑因素需要进行无祖先查询?

2 个答案:

答案 0 :(得分:1)

  

如果使用祖先保存实体,则必须按此查询   祖先?

不,你不必。

  

如何查询实体,无论他们是否是孩子,   或根实体?

here

简化为尽可能简单的示例
//Assuming c is your appengine context
q = datastore.NewQuery("MyObject") // Can add filters and sorting here if desired.

for t := q.Run(c);; {
    var x MyObject
    key, err := t.Next(&x)
}

我还发现了这封说明here

  

注意:设置祖先过滤器允许强烈一致   查询。没有祖先过滤器的查询最终只返回   一致的结果。

这很重要,因为我相信所有数据存储都是HRD。您可以阅读有关high replication datastores的更多信息。

答案 1 :(得分:0)

defaultTodoList(c)可能不包含代码期望它包含的父实体。尝试在使用之前以某种方式验证其值,例如将其存储在变量中,然后将logging数据存储在变量中。