Как была создана общая карта функции Find? - PullRequest
1 голос
/ 05 апреля 2019

Я смотрю на этот пример. Я бы никогда не взялся за решение, подобное этому, я бы пошел на bson.raw.

type Movie struct {
    ID        bson.ObjectId `json:"id" bson:"_id,omitempty"`
    Name      string        `json:"name" bson:"name"`
    Year      string        `json:"year" bson:"year"`
    Directors []string      `json:"directors" bson:"directors"`
    Writers   []string      `json:"writers" bson:"writers"`
    BoxOffice BoxOffice     `json:"boxOffice" bson:"boxOffice"`
}

Функция GetMovie считывает данные из MongoDB и возвращает JSON

func (db *DB) GetMovie(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)
    var movie Movie
    err := db.collection.Find(bson.M{"_id": bson.ObjectIdHex(vars["id"])}).One(&movie)
    if err != nil {
        w.Write([]byte(err.Error()))
    } else {
        w.Header().Set("Content-Type", "application/json")
        response, _ := json.Marshal(movie)
        w.Write(response)
    }

}

Я не понимаю, как создавалась общая карта bson.M. Почему автор использовал bson.ObjectIdHex(vars["id"]?

1 Ответ

4 голосов
/ 05 апреля 2019

bson.M - это карта под капотом:

type M map[string]interface{}

А это:

bson.M{"_id": bson.ObjectIdHex(vars["id"])}

Это составной литерал создание значения типа bson.M.Он имеет одну пару, в которой ключ равен "_id", а соответствующее значение - bson.ObjectId, возвращаемое функцией bson.ObjectIdHex().

Идентификатор документа дляпоиск и возврат, скорее всего, идут в виде шестнадцатеричной строки в vars["id"], а bson.ObjectIdHex() преобразует (анализирует) это в ObjectId.

Советы: для запроса документа по идентификатору прощеиспользуйте Collection.FindId, например:

err := db.collection.FindId(bson.ObjectIdHex(vars["id"])).One(&movie)

Также, чтобы избежать паники во время выполнения в случае, если в vars["id"] сохранен неверный идентификатор, вы можете использовать bson.IsObjectIdHex() чтобы проверить это первым.Для получения дополнительной информации см. Предотвращение паники во время выполнения в bson.ObjectIdHex .

Кроме того, маршалинг результата в байтовый фрагмент и последующая запись его в ответ неэффективен, ответ может быть передан в потоквывод с использованием json.Encoder.Для получения дополнительной информации см. Выход JSON на http.ResponseWriter с шаблоном .

...