У меня небольшое ощущение, что я упускаю очевидное, но, похоже, не могу понять это.Я перевожу 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 различных объекта, каждый из которых хранит соответствующий ключ Ancestor:
Страна объекта: Родитель = нольРегион образования: Родитель = СтранаСостояние объекта: родитель = регион
Я бы хотел запросить заданный список состояний и построить правильное представление всей иерархии в структурах.Я мог бы добиться этого, извлекая все сущности «Состояния», которые сначала удовлетворяют моим критериям:
var state []*State
query := datastore.NewQuery("State").Filter("Name=", params[i])
if _, err = client.GetAll(ctx, query, &state); err != nil {
return nil, err
}
, а затем перебираем состояние, чтобы найти регион, к которому принадлежит каждое состояние:
var region Region
if err := client.Get(ctx, state[i].Key.Parent, ®ion); err != nil {
return nil, err
}
Проблема с этимРешение состоит в том, что более одного возвращенного состояния может принадлежать одному и тому же региону, и если я получу родительский регион для каждого состояния, я в конечном итоге получу кусочек областей, в которых, скорее всего, будут повторяться области с одним состоянием в каждом.
Я знаю, что мог бы решить эту проблему с помощью сортировки кода и проверки, был ли регион уже добавлен, а затем просто добавить к нему состояние.Однако это решение кажется очень громоздким способом решения этой проблемы, и мне интересно, есть ли у меня другие альтернативы.
Как примечание, эта модель является лишь упрощенным представлением реальной.Реальная модель имеет 9 уровней в иерархии, и пользователи могут искать до самого низкого уровня, и соответствующее дерево должно быть представлено в окончательном JSON.