Продемонстрируйте операции CRUD самым простым способом.
Первым шагом будет установка драйвера MongoDB и Gorilla Mux с помощью go get
, а также проверка официальной страницы GitHub драйвера mongoDB.
go get -u github.com/gorilla/mux
go get github.com/mongodb/mongo-go-driver
При использовании go get может появиться предупреждающее сообщение, похожее на «пакет go.mongodb.org/mongo-driver: нет файлов Go в (…)». Не пугайтесь этого. Такой вывод является частью ожидаемого поведения.
- Я создал три файла с именами
main.go ,db.go and controllers.go.
. Итак, структура выглядит так:
mongoDB CRUD/ ├─ main.go ├─ model/ │ ├─ model1.go ├─ controller/ │ ├─ controller.go ├─ router/ │ ├─ router.go
main.go
Давайте перейдем к анатомии файлов один за другим, начиная с main.go
package main import ( "fmt" "log" "mongodb/router" "net/http" ) func main() { fmt.Println("MongoDB setup for Golang") r := router.Router() fmt.Println("Server Is Getting Started...") log.Fatal(http.ListenAndServe(":4000", r)) fmt.Println("Listening 4000 port...") }
Я использовал «пакет gorilla/mux», который предоставляет маршрутизатор запросов и диспетчер для связывания входящих запросов с соответствующими обработчиками. С помощью HandleFunc
новый маршрут регистрируется в сопоставителе для пути URL.
model1.go
package model import ( "go.mongodb.org/mongo-driver/bson/primitive" ) type Netflix struct { ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` Movie string `json:"movie,omitempty"` Watched bool `json:"watched,omitempty"` }
Этот фрагмент кода находится в пакете «model» и импортирует необходимый модуль «go.mongodb.org/mongo-driver/bson/primitive» для примитивных типов данных BSON.
Он определяет структуру с именем «Netflix», которая представляет сущность фильма. Структура имеет следующие поля:
ID
: Это поле имеет типprimitive.ObjectID
и используется для уникальной идентификации фильма. Он имеет теги JSON и BSON, чтобы указать, как поле обрабатывается в кодировке JSON и сериализации BSON.Movie
: Это поле содержит название или название фильма. У него есть тег JSON, указывающий, как он должен отображаться в данных JSON.Watched
: это логическое значение, указывающее, был ли просмотрен фильм. Он имеет тег JSON для управления его отображением в данных JSON.
контроллер.го
package controller import ( "context" "encoding/json" "fmt" "log" "mongodb/model" "net/http" "github.com/gorilla/mux" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) const connectRemote = "mongodb://localhost:27017" const dbName = "netflix" const colName = "watchedlist" // Important var collection *mongo.Collection func checkNilError(err error) { if err != nil { log.Fatal(err) } } func init() { // Client option clientOptions := options.Client().ApplyURI(connectRemote) //Connect to mongodb client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Fatal(err) } fmt.Println("MongoDB connection Done") collection = client.Database(dbName).Collection(colName) //Collection ready fmt.Println("Collection is ready") } //MongoDB helpers //insert one record func insertOneMovie(movie model.Netflix) { inserted, err := collection.InsertOne(context.Background(), movie) checkNilError(err) fmt.Println("Inserted one movie with ID:", inserted.InsertedID) } // update one record func updateOneMovie(movieID string) { id, err := primitive.ObjectIDFromHex(movieID) checkNilError(err) filter := bson.M{"_id": id} update := bson.M{"$set": bson.M{"watched": true}} result, err := collection.UpdateOne(context.Background(), filter, update) checkNilError(err) fmt.Println("Modified Count:", result.ModifiedCount) } // delete one record func deleteOneMovie(movieID string) { id, err := primitive.ObjectIDFromHex(movieID) checkNilError(err) filter := bson.M{"_id": id} delCount, err := collection.DeleteOne(context.Background(), filter) checkNilError(err) fmt.Println("Deleted Movie Count:", delCount) } //delete all record func deleteAllMovie() int64 { delCount, err := collection.DeleteMany(context.Background(), bson.D{{}},nil) checkNilError(err) fmt.Println("No of movies deleted:", delCount.DeletedCount) return delCount.DeletedCount } //get all movies from DB func getAllMovies() []primitive.M { cur, err := collection.Find(context.Background(), bson.D{{}}) checkNilError(err) var movies []primitive.M for cur.Next(context.Background()) { var movie bson.M err := cur.Decode(&movie) checkNilError(err) movies = append(movies, movie) } defer cur.Close(context.Background()) return movies } //Actual Controllers func GetAlIMovies(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Allow-Control-Allow-Methods", "GET") allMovies := getAllMovies() json.NewEncoder(w).Encode(allMovies) } func CreateMovie(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Allow-Control-Allow-Methods", "POST") var movie model.Netflix _ = json.NewDecoder(r.Body).Decode(&movie) insertOneMovie(movie) json.NewEncoder(w).Encode(movie) } func MarkAsWatched(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Allow-Control-Allow-Methods", "PUT") params := mux.Vars(r) updateOneMovie(params["id"]) json.NewEncoder(w).Encode(params) } func DeleteMovie(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Allow-Control-Allow-Methods", "DELETE") params := mux.Vars(r) deleteOneMovie(params["id"]) json.NewEncoder(w).Encode(params["id"]) } func DeleteAllMovies(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Allow-Control-Allow-Methods", "DELETE") count := deleteAllMovie() json.NewEncoder(w).Encode(count) }
Разобьем код на разделы:
- Импорт. Код импортирует необходимые пакеты, включая драйвер MongoDB, маршрутизатор Gorilla Mux для обработки HTTP-запросов и ваш пользовательский пакет «образец».
- Константы и переменные:
connectRemote
: строка подключения к серверу MongoDB.dbName
: имя базы данных MongoDB.colName
: Имя коллекции в базе данных.collection
: переменная для хранения ссылки на коллекцию MongoDB.
Вспомогательные функции:
checkNilError
: Вспомогательная функция для регистрации и выхода из приложения в случае возникновения ошибки.init()
: функция инициализации, которая подключается к серверу MongoDB, выбирает указанную базу данных и коллекцию и устанавливает переменнуюcollection
.
Вспомогательные функции MongoDB:
- Функции для вставки, обновления, удаления и извлечения фильмов из коллекции MongoDB.
Обработчики HTTP (контроллеры):
GetAllMovies
: обрабатывает HTTP-запросы GET для получения всех фильмов из коллекции.CreateMovie
: обрабатывает HTTP-запросы POST для создания новой записи фильма.MarkAsWatched
: обрабатывает HTTP-запросы PUT, чтобы пометить фильм как просмотренный.DeleteMovie
: обрабатывает HTTP-запросы DELETE на удаление фильма.DeleteAllMovies
: обрабатывает HTTP-запросы DELETE на удаление всех фильмов из коллекции.
Объяснение. Этот код определяет API на основе HTTP для управления списком фильмов, хранящихся в базе данных MongoDB. API позволяет выполнять следующие действия:
- Получить список всех фильмов.
- Создайте новую запись о фильме.
- Отметить фильм как просмотренный.
- Удалить один фильм.
- Удалить все записи фильмов.
- Заголовки HTTP:
- Код устанавливает соответствующие заголовки HTTP в ответе, чтобы указать разрешенные методы и тип содержимого.
2.Кодирование/декодирование JSON:
- Код использует пакет
json
для кодирования и декодирования данных JSON для связи с клиентом.
3. Маршрутизация:
- Маршрутизатор Gorilla Mux используется для определения маршрутов и сопоставления их с соответствующими функциями контроллера.
роутер.го
package router import ( "mongodb/controller" "github.com/gorilla/mux" ) // Captial means exporting the method func Router() *mux.Router { router := mux.NewRouter() router.HandleFunc("/api/movies", controller.GetAlIMovies).Methods("GET") router.HandleFunc("/api/movie", controller.CreateMovie).Methods("POST") router.HandleFunc("/api/movie/{id}", controller.MarkAsWatched).Methods("PUT") router.HandleFunc("/api/movie/{id}", controller.DeleteMovie).Methods("DELETE") router.HandleFunc("/api/delallmovies", controller.DeleteAllMovies).Methods("DELETE") return router }
Вот разбивка кода:
- Импорт:
- Код импортирует необходимые пакеты:
"mongodb/controller"
для импорта функций контроллера и"github.com/gorilla/mux"
для маршрутизатора Gorilla Mux.
Функция маршрутизатора (Router()
):
- Эта функция возвращает сконфигурированный экземпляр маршрутизатора Gorilla Mux.
Конфигурация маршрутизатора:
- Функция инициализирует новый маршрутизатор Gorilla Mux, используя
mux.NewRouter()
.
- Определения маршрута:
- Код использует метод маршрутизатора
HandleFunc
для определения маршрутов и связывания их с соответствующими функциями контроллера. "/api/movies"
: обрабатывает HTTP-запросы GET для получения всех фильмов с помощью функции контроллераGetAlIMovies
."/api/movie"
: обрабатывает HTTP-запросы POST для создания нового фильма с использованием функции контроллераCreateMovie
."/api/movie/{id}"
: обрабатывает HTTP-запросы PUT для отметки фильма как просмотренного с помощью функции контроллераMarkAsWatched
. Сегмент{id}
— это параметр URL, представляющий идентификатор фильма."/api/movie/{id}"
: обрабатывает HTTP-запросы DELETE на удаление фильма с помощью функции контроллераDeleteMovie
. Опять же, сегмент{id}
является параметром URL."/api/delallmovies"
: обрабатывает HTTP-запросы DELETE на удаление всех фильмов с помощью функции контроллераDeleteAllMovies
.
Методы HTTP:
- Метод
.Methods()
используется для указания методов HTTP, разрешенных для каждого маршрута.
Возврат маршрутизатора:
- Функция возвращает настроенный маршрутизатор.
Давайте создадим и протестируем приложение:
Для запуска приложения выполните команды
go build main.go
за которым следуетgo run main.go
Эти команды запустят сервер и установят соединение с сервером MongoDB.
Данные в MongoDB:
Команды и работа API:
Здесь — git-репозиторий для всего кода. Я надеюсь, что это руководство было полезным, чтобы получить некоторое представление о приложении CRUD.
Спасибо, что дочитали до конца. Пожалуйста, следите за автором и этой публикацией. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное обучение программированию по всему миру.
Ссылки: