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

Google app engine 在查询相同类型的根实体和子实体时,数据存储是否需要指定祖先?,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,例如,从提供的示例中获取以下代码段: func getAllTodos(c appengine.Context)([]Todo,错误){ 待办事项:=[]待办事项{} ks,err:=datastore.NewQuery(“Todo”).consensor(defaultTodoList(c)).Order(“Created”).GetAll(c,&todos) 如果错误!=零{ 返回零,错误 } 对于i:=0;i

例如,从提供的示例中获取以下代码段:

func getAllTodos(c appengine.Context)([]Todo,错误){
待办事项:=[]待办事项{}
ks,err:=datastore.NewQuery(“Todo”).consensor(defaultTodoList(c)).Order(“Created”).GetAll(c,&todos)
如果错误!=零{
返回零,错误
}
对于i:=0;i
如果将查询更改为不包含
.consent(defaultTodoList(c))。
函数将无法返回任何todo结果

  • 如果一个实体是用一个祖先保存的,您必须通过该祖先查询它吗
  • 如何查询实体,而不管它们是子实体还是根实体
  • 考虑到需要执行无祖先查询,在为我的应用程序建模时,我应该考虑哪些性能和体系结构因素
defaultTodoList(c)
可能不包含代码期望它包含的父实体。在使用它之前,尝试以某种方式验证它的值,例如,将它存储在变量中,然后从中取出数据

如果一个实体是用一个祖先保存的,那么您必须通过该祖先来查询它吗 祖先

不,你不必

无论实体是否为子实体,如何查询实体, 还是根实体

简化为一个尽可能简单的示例:

我还发现了这张便条:

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


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

嗨,本。谢谢——我怀疑这与最终的一致性有关。实际上,我觉得应该避免这种类型的查询。我是数据存储新手,您能帮助我更好地理解涉及的数据建模注意事项吗?基本上,仅仅因为您在一个实例的数据存储中添加/修改数据,并不保证另一个实例可以通过查询立即获取该数据。然而,直接的“获取”总是一致的。如果在查询中需要一致性,则必须使用祖先查询
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
}
//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)
}