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



例如,从提供的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)).,则该函数将无法返回任何todo结果。

  • 如果一个实体保存了一个祖先,你必须通过那个祖先查询它吗?
  • 如何查询实体,无论它们是子实体还是根实体?
  • 在需要进行无祖先查询的情况下,我应该在建模应用程序时考虑哪些性能和架构因素?

如果一个实体被保存了一个祖先,你必须用那个来查询它吗祖先吗?

不,你不需要。

如何查询实体而不管它们是否是子实体,还是根实体?

从这里简化为尽可能简单的例子:

//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)
}

我还在这里发现了这个注释:

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

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

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

最新更新