【问题标题】:Google Could Datastore Hierarchy Tree Filtering Child with GoGoogle Cloud Datastore Hierarchy Tree Filtering Child with Go
【发布时间】:2019-03-10 09:42:28
【问题描述】:

我有一种轻微的感觉,我错过了明显的东西,但似乎无法弄清楚这一点。 我正在将 API 从传统的 MySQL 数据模型迁移到 Cloud Datastore,并且在使用 Go Library 过滤子实体时无法递归地构建层次结构树。

我的模型如下所示:

    type Country struct {
        Key *datastore.Key `datastore:"__key__"`
        Id int
        Name string
        Region []Region
    }

    type Region struct {
        Key *datastore.Key `datastore:"__key__"`
        Id int
        Name string
        State []State
    }

    type State struct {
        Key *datastore.Key `datastore:"__key__"`
        Id int
        Name string
    }

在数据存储中使用嵌套实体,如上面的表示。在数据存储中,我有 3 个不同的实体,每个实体都使用各自的祖先键存储:

实体国家/地区:父级 = 无
实体区域:父级 = 国家/地区
实体状态:父级 = 地区

我想查询给定的状态列表并在结构中构建整个层次结构的正确表示。我可以首先检索满足我的标准的所有州实体来实现这一点:

    var state []*State

    query := datastore.NewQuery("State").Filter("Name=", params[i])

    if _, err = client.GetAll(ctx, query, &state); err != nil {
        return nil, err
    }

然后遍历 state 以查找每个 state 所属的区域:

    var region Region

    if err := client.Get(ctx, state[i].Key.Parent, &region); err != nil {
        return nil, err
    }

这个解决方案的问题在于,返回的多个状态可以属于同一个区域,如果我获得每个状态的父区域,我最终会得到一个区域切片,这些区域可能在每个都有一个状态。

我知道我可以通过我的代码排序来解决这个问题,并检查是否已经添加了一个区域,然后将状态附加到它上面。但是,这个解决方案似乎是解决这个问题的一种非常繁琐的方法,我想知道我是否还有其他选择。

顺便说一句,这个模型只是真实模型的简化表示。真实模型在层次结构中有 9 个级别,用户可以搜索到最低级别,相应的树需要在最终的 JSON 中表示。

【问题讨论】:

    标签: go google-cloud-datastore


    【解决方案1】:

    我不完全确定你在做什么。但是,听起来您应该在父密钥中编码父名称。这样您就可以显示您需要的部分层次结构,而无需获取父实体。例如。完整的子键可能看起来像“(Country, USA), (Region, MidWest), (State, Michigan)”。

    如果这不起作用,我认为您应该按照最初的想法,将要获取的父键放在一组中,然后一次获取所有父键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2023-03-20
      • 2021-10-31
      • 2015-08-21
      • 2023-01-09
      • 1970-01-01
      • 2017-04-13
      • 2020-01-22
      相关资源
      最近更新 更多