Как получить данные как есть из MongoDB и отправить их в API как JSON в Golang - PullRequest
1 голос
/ 27 апреля 2020

Я пишу Golang API на работе, который при вызове получает данные из двух разных коллекций MongoDB и добавляет их в структуру, преобразует их в JSON, переводит в строку и отправляет в API (Amazon SQS)

Проблема заключается в определении структуры данных, получаемых из MongoDB, в то время как некоторые поля определены правильно, некоторые изменяются

// IncentiveRule struct defines the structure of Incentive rule from Mongo
type IncentiveRule struct {
    ... Other vars
    Rule               Rule               `bson:"rule" json:"rule"`
    ... Other vars
}

// Rule defines the struct for Rule Object inside an incentive rule
type Rule struct {
    ...
    Rules          interface{}    `bson:"rules" json:"rules"`
    RuleFilter     RuleFilter     `bson:"rule_filter" bson:"rule_filter"`
    ...
}

// RuleFilter ...
type RuleFilter struct {
    Condition string        `bson:"condition" json:"condition"`
    Rules     []interface{} `bson:"rules" json:"rules"`
}

Хотя это работает, interface{} определяется внутри Rule структура меняется и при получении как BSON и декодировании и перекодировании в JSON вместо кодирования как "fookey":"barvalue" в JSON, она кодируется как "Key":"fookey","Value":"barvalue", как избежать этого поведения и иметь его как "fookey":"barvalue"

1 Ответ

2 голосов
/ 27 апреля 2020

Если вы используете interface{}, драйвер mon go - go может выбрать любую реализацию, которую он считает подходящей для представления результатов. Часто он выбирает bson.D для представления документов, представляющих собой упорядоченный список пар ключ-значение, где пара представляет собой структуру, имеющую поле для Key и поле для Value, поэтому * Значение 1020 * может сохранить порядок полей.

Если порядок полей не требуется / не важен, вы можете явно использовать bson.M вместо interface{} и []bson.M вместо []interface{}. bson.M - неупорядоченная карта, но она представляет поля в виде fieldName: fieldValue, что именно то, что вам нужно.

...