Google Could Datastore Дерево иерархии Фильтрация дочерних элементов с помощью Go - PullRequest
0 голосов
/ 10 марта 2019

У меня небольшое ощущение, что я упускаю очевидное, но, похоже, не могу понять это.Я перевожу 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, &region); err != nil {
        return nil, err
    }

Проблема с этимРешение состоит в том, что более одного возвращенного состояния может принадлежать одному и тому же региону, и если я получу родительский регион для каждого состояния, я в конечном итоге получу кусочек областей, в которых, скорее всего, будут повторяться области с одним состоянием в каждом.

Я знаю, что мог бы решить эту проблему с помощью сортировки кода и проверки, был ли регион уже добавлен, а затем просто добавить к нему состояние.Однако это решение кажется очень громоздким способом решения этой проблемы, и мне интересно, есть ли у меня другие альтернативы.

Как примечание, эта модель является лишь упрощенным представлением реальной.Реальная модель имеет 9 уровней в иерархии, и пользователи могут искать до самого низкого уровня, и соответствующее дерево должно быть представлено в окончательном JSON.

1 Ответ

0 голосов
/ 12 марта 2019

Я не совсем уверен, что ты делаешь. Тем не менее, похоже, что вы должны кодировать имя родителя в ключе родителя. Таким образом, вы можете отобразить нужную вам часть иерархии, не выбирая родительские объекты. Например. полный дочерний ключ может выглядеть как «(Страна, США), (Регион, Средний Запад), (Штат, Мичиган)».

Если это не сработает, я думаю, что вы должны следовать своей первоначальной идее: поставить родительские ключи для выборки в наборе, а затем выбрать всех родителей сразу.

...