【问题标题】:Does datastore require an ancestor to be specified when querying root and children entities of the same type?查询相同类型的根实体和子实体时,数据存储是否需要指定祖先?
【发布时间】:2014-03-20 23:41:47
【问题描述】:

例如,从提供的appengine-angular-gotodos 中获取以下 sn-p :

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

  • 如果实体与祖先一起保存,您必须通过该祖先查询它吗?
  • 如何查询实体,无论它们是子实体还是根实体?
  • 鉴于需要进行无祖先查询,在对应用程序建模时应该考虑哪些性能和体系结构?

【问题讨论】:

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


    【解决方案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的信息。

    【讨论】:

    • 嗨,本。谢谢——我怀疑这与最终的一致性有关。在实践中,我觉得应该避免这种类型的查询。我是数据存储的新手,您能否帮助我更好地了解所涉及的数据建模注意事项?
    • 基本上仅仅因为您在一个实例的数据存储中添加/修改数据并不能保证另一个实例可以通过查询立即获取该数据。但是,直接“获取”将始终保持一致。如果您需要查询的一致性,则必须使用祖先查询
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多