【发布时间】: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, ®ion); err != nil {
return nil, err
}
这个解决方案的问题在于,返回的多个状态可以属于同一个区域,如果我获得每个状态的父区域,我最终会得到一个区域切片,这些区域可能在每个都有一个状态。
我知道我可以通过我的代码排序来解决这个问题,并检查是否已经添加了一个区域,然后将状态附加到它上面。但是,这个解决方案似乎是解决这个问题的一种非常繁琐的方法,我想知道我是否还有其他选择。
顺便说一句,这个模型只是真实模型的简化表示。真实模型在层次结构中有 9 个级别,用户可以搜索到最低级别,相应的树需要在最终的 JSON 中表示。
【问题讨论】: