Добавить новый поддокумент в массив в основной структуре - PullRequest
0 голосов
/ 22 октября 2018

В моей базе данных MongoDB есть следующие структуры go:

type Station struct {
    ID          bson.ObjectId `bson:"_id" json:"id"`
    Name        string        `bson:"name" json:"name"`
    Sensors     []Sensor `bson:"sensors" json:"sensors"`
}

type Sensor struct {
    ID             bson.ObjectId `bson:"_id" json:"id"`
    Type string `  bson:"type" json:"type"`
    Value float64 `bson:"value" json:"value"`
}

Когда я делаю запрос POST в конечной точке localhost:3000/stations/<IDofTheStation/sensors, он должен добавить новый датчик к указанной станции.

В настоящее время у меня есть этот код

func AddSensorToStation(w http.ResponseWriter, r *http.Request) {
    defer r.Body.Close()
    params := mux.Vars(r)

    station, err := dao.FindById(params["id"])
    if err != nil {
        respondWithError(w, http.StatusBadRequest, "Invalid Station ID")
        return
    }

    sensor := Sensor{Type: "test"}

    station.Sensors = append(station.Sensors, sensor)   

    if err := dao.Update(station); err != nil {
        respondWithError(w, http.StatusInternalServerError, err.Error())
        return
    }

    respondWithJson(w, http.StatusOK, station)
}

Проблема в том, что он не генерирует автоматически идентификатор для нового датчика, который я хочу добавить, поэтому он выдает ошибку " ObjectIDs должен бытьдлина ровно 12 байтов (получено 0)"

Каков наилучший способ добавить новый экземпляр датчика в массив датчиков, где БД генерирует идентификатор для датчика?

1 Ответ

0 голосов
/ 22 октября 2018

MongoDB никогда не будет генерировать ID для вложенного документа на стороне сервера.

Вам действительно нужен ID на датчике?MongoDB не будет жаловаться на то, что поддокумент не имеет ID (или его ID имеет неправильный формат), потому что поддокумент может иметь произвольную структуру - так что он может легко существовать без ID.

Если вам по какой-то причине нужен идентификатор, вы можете, конечно, создать его на стороне клиента:

sensor.ID := bson.NewObjectId()
...