Запрос на обновление в драйвере MGO, работает с bson.M, но не работает со структурой custom

Мго и вопрос о голанге.

Я снова сталкиваюсь с проблемой. Я пытаюсь обновить запись в базе данных, но выполнение простой команды visitors.UpdateId(v.Id, bson.M{"$set": zscore});, где zscore - переменная type Zscore, не работает. Однако, если я вручную конвертирую zscore в структуру bson.M, все работает нормально.

Кто-нибудь знает, как обновить запись в mongodb с помощью mgo, без ручного сброса значений структуры в bson.M?

Пример:

type Zscore struct {
    a float64 `bson:"a,omitempty" json:"a"`
    b float64 `bson:"b,omitempty" json:"b"`
    c float64 `bson:"c,omitempty" json:"c"`
}

v := Visitor{}
zscore := Zscore{}

visitors := updater.C("visitors")

for result.Next(&v) {
    zscore.a = 1
    zscore.b = 2
    zscore.c = 0

    //does not work
    if err := visitors.UpdateId(v.Id, bson.M{"$set": zscore}); err != nil    {
            log.Printf("Got error while updating visitor: %v\n", err)
    }

    //works
    set := bson.M{
        "zscore.a": zscore.a,
        "zscore.b": zscore.b,
        "zscore.c": zscore.c,
    }

    if err := visitors.UpdateId(v.Id, bson.M{"$set": set}); err != nil {
        log.Printf("Got error while updating visitor: %v\n", err)
    }
}

person Luke    schedule 09.03.2015    source источник


Ответы (1)


Все известные мне пакеты маршалинга Go, включая пакет bson, не будут маршалировать поля, которые частные (начинаются со строчной буквы). Чтобы решить эту проблему, просто экспортируйте соответствующие поля, введя верхнюю букву их имени в верхний регистр.

Также обратите внимание, что, помимо проблемы, упомянутой выше, первая часть вашего примера не будет маршалирована аналогично второй части. bson.M{"$set": zscore} эквивалентно bson.M{"$set": bson.M{"a": ... etc ...}}.

person Gustavo Niemeyer    schedule 09.03.2015
comment
спасибо, теперь отлично работает ... как вы узнали, что поля не могут быть приватными? - person Luke; 09.03.2015
comment
@Lukasz, вероятно, из документации: в случае значений структуры , будут сериализованы только экспортированные поля. Как всегда, RTFM. - person Dave C; 10.03.2015
comment
Что ж ... предложение Имя поля в нижнем регистре используется в качестве ключа для каждого экспортируемого поля, но это поведение может быть изменено с помощью соответствующего тега поля. делает документацию не очевидной на 100%. Можно подумать, что этот тег контролирует, что сериализуется, а что нет. - person Luke; 10.03.2015
comment
Эти два предложения дополняют друг друга и не противоречат друг другу. Только экспортированные поля будут сериализованы, а для сериализованных может быть изменен ключ для каждого экспортированного поля с помощью тега. - person Gustavo Niemeyer; 12.03.2015