猿问

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

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

  • 如果实体与祖先一起保存,您是否必须通过该祖先查询它?

  • 无论实体是子实体还是根实体,您如何查询实体?

  • 鉴于需要进行无祖先查询,在对应用程序建模时应该考虑哪些性能和架构?


慕运维8079593
浏览 205回答 2
2回答

白衣染霜花

如果实体与祖先一起保存,您是否必须通过该祖先查询它?不,你不必。无论实体是子实体还是根实体,您如何查询实体?从这里简化为尽可能简单的示例://Assuming c is your appengine contextq = datastore.NewQuery("MyObject") // Can add filters and sorting here if desired.for t := q.Run(c);; {&nbsp; &nbsp; var x MyObject&nbsp; &nbsp; key, err := t.Next(&x)}我还在这里找到了这个注释:注意:设置祖先过滤器允许强一致性查询。没有祖先过滤器的查询只返回最终一致的结果。这很重要,因为我相信现在所有的数据存储都是 HRD。您可以阅读有关高复制数据存储的更多信息。

米脂

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

相关分类

Go
我要回答