Продемонстрируйте операции 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», которая представляет сущность фильма. Структура имеет следующие поля:

  1. ID: Это поле имеет тип primitive.ObjectID и используется для уникальной идентификации фильма. Он имеет теги JSON и BSON, чтобы указать, как поле обрабатывается в кодировке JSON и сериализации BSON.
  2. Movie: Это поле содержит название или название фильма. У него есть тег JSON, указывающий, как он должен отображаться в данных JSON.
  3. 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)

}

Разобьем код на разделы:

  1. Импорт. Код импортирует необходимые пакеты, включая драйвер MongoDB, маршрутизатор Gorilla Mux для обработки HTTP-запросов и ваш пользовательский пакет «образец».
  2. Константы и переменные:
  • 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 позволяет выполнять следующие действия:

  • Получить список всех фильмов.
  • Создайте новую запись о фильме.
  • Отметить фильм как просмотренный.
  • Удалить один фильм.
  • Удалить все записи фильмов.
  1. Заголовки 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
}

Вот разбивка кода:

  1. Импорт:
  • Код импортирует необходимые пакеты: "mongodb/controller" для импорта функций контроллера и "github.com/gorilla/mux" для маршрутизатора Gorilla Mux.

Функция маршрутизатора (Router()):

  • Эта функция возвращает сконфигурированный экземпляр маршрутизатора Gorilla Mux.

Конфигурация маршрутизатора:

  • Функция инициализирует новый маршрутизатор Gorilla Mux, используя mux.NewRouter().
  1. Определения маршрута:
  • Код использует метод маршрутизатора 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, чтобы узнать больше о том, как мы демократизируем бесплатное обучение программированию по всему миру.

Ссылки: