Go-lang Gorilla API + MongoDB за 30 минут

Во-первых, мы должны поговорить о семействе баз данных No-SQL, к которому принадлежит MongoDB, во-вторых, мы должны коснуться того, как установить MongoDB в нашу систему (я предполагаю, что вы используете один из дистрибутивов Linux), а затем мы интегрируем эту базу данных MongoDB с простым Gorilla-Mux API.

Код к этой статье можно найти здесь.

No-SQL (нереляционные базы данных)

Это документально-ориентированные базы данных, формат хранения данных в которых отличается от SQL баз данных, таких как MySQL или PostgreSQL. Существуют различные типы нереляционных баз данных, основанные на их модели данных. Основными типами являются базы данных документов, такие как MongoDB, базы данных ключевых значений, такие как Redis, базы данных с широким столбцом, такие как Apache и Cassandra, и, наконец, графовые базы данных, такие как Orient-DB, Dgraph.

Базы данных No-SQL дают разработчикам свободу хранения огромных объемов неструктурированных данных. Это связано с тем, что базы данных No-SQL менее структурированы или ограничены по формату, что обеспечивает большую гибкость и адаптируемость к типу хранимых данных.

Популярным примером приложения, использующего базу данных No-SQL, является приложение Messenger от Facebook, которое использует Apache HBase для потоковой передачи данных на кластеры Hadoop. Apache HBase — это ширококолоночная база данных, созданная по образцу Big Table от Google.

Характеристики баз данных No-SQL (нереляционных):

  • Простота интеграции и использования в приложениях для разработчиков
  • Позволяет горизонтальное или горизонтальное масштабирование.
  • Позволяют быстро выполнять запросы
  • Имеют гибкую схему.

Более подробно эта тема раскрыта в этой статье здесь.

Установка MongoDB

Сначала мы обновим apt и установим MongoDB, как показано ниже:


mykmyk@skynet:~$ sudo apt update

Войдите в полноэкранный режим Выйдите из полноэкранного режима

затем;

mykmyk@skynet:~$ sudo apt-get install mongodb

Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь, чтобы убедиться, что ваша база данных MongoBD установлена
правильно, проверьте это, выполнив следующие действия:

mykmyk@skynet:~$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
Server has startup warnings: 
2022-07-23T22:58:19.824+0300 I STORAGE  [initandlisten] 
2022-07-23T22:58:19.824+0300 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2022-07-23T22:58:19.824+0300 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2022-07-23T22:58:30.835+0300 I CONTROL  [initandlisten] 
2022-07-23T22:58:30.835+0300 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2022-07-23T22:58:30.835+0300 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2022-07-23T22:58:30.835+0300 I CONTROL  [initandlisten] 
>
Войдите в полноэкранный режим Выйти из полноэкранного режима

Если вы столкнулись с ошибками во время установки MongoDB, я отсылаю вас к этой хорошо написанной статье, она должна стать достаточным руководством для безопасной установки базы данных в вашей системе.

Чтобы проверить базы данных, доступные в нашей MongoDB DMS:

> show databases;
admin   0.000GB
appdb   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

Войдите в полноэкранный режим Выйти из полноэкранного режима

Приведенная выше команда «show databases» выводит список всех доступных баз данных, по умолчанию, admin, test и local — это три базы данных, которые должны быть доступны перед созданием новой базы данных;
Мы собираемся создать базу данных под названием «booksdb», поэтому, находясь в оболочке MongoDB:

> use booksdb;
switched to db booksdb

Войдите в полноэкранный режим Выйти из полноэкранного режима

Команда «use booksdb» выше переключается с текущей базы данных на базу данных booksdb, которую мы только что создали. Интересно отметить, что «booksdb» не появится, если мы запросим все доступные базы данных с помощью команды «show databases». Попробуйте это сделать.

> use booksdb;
switched to db booksdb
> show databases;
admin   0.000GB
appdb   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
Вход в полноэкранный режим Выход из полноэкранного режима

Вышеописанное явление является результатом внутренней реализации MongoDB, база данных создается в MongoDB только тогда, когда в нее вставляются фактические начальные данные, поэтому давайте сделаем это.

все еще находясь в оболочке MongoDB, введите:

> db.books.insertOne({_id:5, title: 'A Song Of Ice and Fire',authors:['George R.R Martin','Phyllis Eisenstein'],publishdate:'August 1,1996',characters:['Jon Snow','Daenerys Targaryen','Eddard Star','Sansa Stark','Jammie Lannister','Rob Stark','Cerser Lannister'],publisher:{name:'Bantam Books',country:'United States',website:'www.randomhousebooks.com'}})
{ "acknowledged" : true, "insertedId" : 5 }

Войти в полноэкранный режим Выйти из полноэкранного режима

В json, который мы только что вставили, есть идентификатор _id, мы можем либо указать этот идентификатор при вставке нашего объекта books, либо предоставить MongoDB вставить его за нас. Попробуем вставить книгу без указания идентификатора и посмотрим, что сделает MongoDB:

> db.books.insertOne({title: 'A Feast Of Crows',authors:['George R.R Martin'],publishdate:'August 1,1996',characters:['Jon Snow','Daenerys Targaryen','Eddard Star','Sansa Stark','Jammie Lannister','Rob Stark','Cerser Lannister'],publisher:{name:'Bantam Books',country:'United States',website:'www.randomhousebooks.com'}})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("62dda3f1457193537fd4d245")
}
> 
Войти в полноэкранный режим Выход из полноэкранного режима

Как вы можете видеть выше, в JSON-ответе insert aknowledgment, значение insertId теперь изменилось на длинное хэш-значение, которое генерируется внутри MongoDB, в нашем случае это «62dda3f1457193537fd4d245».

Для поиска книг мы используем ключевое слово find(), как показано ниже:

> db.books.find()
{ "_id" : 5, "title" : "A Song Of Ice and Fire", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
{ "_id" : ObjectId("62dda3f1457193537fd4d245"), "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
> 

Вход в полноэкранный режим Выйти из полноэкранного режима

Функция find() без каких-либо дополнительных аргументов возвращает все
документы в нашей коллекции «booksdb». Для возврата одного документа мы используем findOne(), если он пуст, то возвращает последний документ, т.е:

> db.books.findOne()
{
    "_id" : 5,
    "title" : "A Song Of Ice and Fire",
    "authors" : [
        "George R.R Martin",
        "Phyllis Eisenstein"
    ],
    "publishdate" : "August 1,1996",
    "characters" : [
        "Jon Snow",
        "Daenerys Targaryen",
        "Eddard Star",
        "Sansa Stark",
        "Jammie Lannister",
        "Rob Stark",
        "Cerser Lannister"
    ],
    "publisher" : {
        "name" : "Bantam Books",
        "country" : "United States",
        "website" : "www.randomhousebooks.com"
    }
}
> 
Вход в полноэкранный режим Выход из полноэкранного режима

Мы можем вводить параметры фильтрации в наши запросы к коллекции find(), как показано ниже:

> db.books.find({title:{$eq: "A Feast Of Crows"}})
{ "_id" : ObjectId("62dda3f1457193537fd4d245"), "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }

Войти в полноэкранный режим Выход из полноэкранного режима

Мы можем удалить документ из заданной коллекции с помощью функций deleteOne и deleteMany:

> db.books.deleteOne({"_id": ObjectId("62dda3f1457193537fd4d245")})
{ "acknowledged" : true, "deletedCount" : 1 }
Войти в полноэкранный режим Выход из полноэкранного режима

На следующем этапе мы сосредоточимся на создании нашего очень простого GorillaMux API:

Gorilla-Mux API

Прежде всего, чтобы наш API мог общаться с базой данных MongoDB, мы будем использовать драйвер базы данных под названием mgo.

mgo- Богатый драйвер MongoDB для Go

Это драйвер MongoDB для go-lang, который позволяет разработчикам создавать приложения, как в нашем случае, и иметь интерфейс API непосредственно с базой данных MongoDB без необходимости проходить через интерактивную оболочку Mongo. Этот драйвер действует как обертка вокруг API MongoDB.

Ознакомьтесь с документацией по этому драйверу здесь, чтобы получить более глубокое представление о его реализации и применении.

Установка mgo:

Сначала создадим папку для нашего приложения, создадим папку под названием MongoGorilla:

mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/GoMongo$ mkdir MongoGorilla

Войдите в полноэкранный режим Выйти из полноэкранного режима

Затем запустите go mod init, который создаст файл go.mod для отслеживания зависимостей, которые мы будем использовать для создания нашего API приложения, как драйвер mgo выше:

mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ go mod init
go: creating new go.mod: module github.com/myk4040okothogodo/MongoGorilla
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ ll
total 12
drwxrwxr-x  2 mykmyk mykmyk 4096 Jul 23 23:24 ./
drwxrwxr-x 20 mykmyk mykmyk 4096 Jul 23 23:09 ../
-rw-rw-r--  1 mykmyk mykmyk   58 Jul 23 23:24 go.mod
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь установим наш драйвер «mgo», как показано ниже:

mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ go get gopkg.in/mgo.v2
go: downloading gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
go: added gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
Войти в полноэкранный режим Выйти из полноэкранного режима

Gorilla-Mux

Далее мы должны добавить пакет gorilla/mux, который поможет реализовать очень простой маршрутизатор в нашем API, чтобы помочь подобрать входящий запрос к соответствующим обработчикам.
Более подробно о пакете и о том, как он реализует свои функции диспетчеризации, читайте здесь.

Чтобы установить пакет и сделать его доступным в нашем проекте, в корневой папке проекта, где находится файл go.mod, введите следующее:

mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ go get -u github.com/gorilla/mux
go: downloading github.com/gorilla/mux v1.8.0
go: added github.com/gorilla/mux v1.8.0
mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ 

Войти в полноэкранный режим Выйти из полноэкранного режима

Создание API

Теперь давайте напишем простую программу, которая общается с базой данных MongoDB с помощью нашего драйвера «mgo» и вставляет запись книги » A song of Ice and Fire».

Создайте файл под названием «main.go», откройте его и добавьте следующий код, показанный ниже:

 1 package main                                                                                                                                                        
  2 
  3 import (
  4   "os"
  5   "os/signal"
  6   "context"
  7   "time"
  8   "net/http"
  9   "io/ioutil"
 10   "encoding/json"
 11   "github.com/hashicorp/go-hclog"
 12   "log"
 13   "github.com/gorilla/mux"
 14   mgo "gopkg.in/mgo.v2"
 15   "gopkg.in/mgo.v2/bson"
 16 
 17 )
 18 
 19 
 20 // The struct below holds our database session information
 21 type DBSession struct {
 22     session      *mgo.Session
 23     collection   *mgo.Collection                                                                                                                                    
 24 }                                                                                                                                                                   
 25                                                                                                                                                                     
 26                                                                                                                                                                     
 27 //Book struct holds book data                                                                                                                                       
 28 type Book struct {                                                                                                                                                  
 29     ID            bson.ObjectId    `json: "id"          bson:"_id,omitempty"`                                                                                       
 30     Title         string           `json: "title"       bson:"title"`                                                                                               
 31     Authors       []string         `json: "authors"     bson: "authors"`                                                                                            
 32     Genre         []string         `json: "genre"       bson: "genre"`                                                                                              
 33     PublishDate   string           `json: "publishdate" bson: "publishdate"`                                                                                        
 34     Characters    []string         `json: "characters"  bson: "characters"`                                                                                         
 35     Publisher     Publisher        `json: "publisher"   bson:"publisher"`                                                                                           
 36 }                                                                                                                                                                   
 37                                                                                                                                                                     
 38  
   39 // Publisher is nested in Movie
 40 type Publisher struct {
 41     Name     string   `json: "budget"    bson:"name"`
 42     Country  string   `json: "country"   bson:"country"`
 43     website  string   `json: "website"   bson:"website"`
 44 }
 45 
 46 
 47 // GetBook fetches a book with a given ID
 48 func (db *DBSession) GetBook (w http.ResponseWriter, r *http.Request){
 49     vars := mux.Vars(r)
 50 
 51     w.WriteHeader(http.StatusOK)
 52     var book Book
 53     err := db.collection.Find(bson.M{"_id": bson.ObjectIdHex(vars["id"])}).One(&book)
 54     if err != nil {
 55         w.Write([]byte(err.Error()))
 56     } else {
 57         w.Header().Set("Content-Type", "application/json")
 58         response, _ := json.Marshal(book)
 59         w.Write(response)
 60     }
 61 }
 62 
 63 
  64 //PostBook adds a new book to our MongoDB collection
 65 func (db *DBSession) PostBook (w http.ResponseWriter, r *http.Request){
 66     var book Book
 67     postBody, _ := ioutil.ReadAll(r.Body)
 68     json.Unmarshal(postBody, &book)
 69 
 70     //Create a Hash ID to insert
 71     book.ID = bson.NewObjectId()
 72     err := db.collection.Insert(book)
 73     if err != nil {
 74         w.Write([]byte(err.Error()))
 75     } else {
 76         w.Header().Set("Content-Type","application/json")
 77         response, _ := json.Marshal(book)
 78         w.Write(response)
 79     }
 80 }
 81 
 82 
 83 
 84 
 85 //UpdateBook modifies the data of an existing book resource
 86 func (db *DBSession) UpdateBook(w http.ResponseWriter, r *http.Request){
 87     vars := mux.Vars(r)
 88     var book Book
 89 
 90     putBody, _ := ioutil.ReadAll(r.Body)
 91     json.Unmarshal(putBody, &book)
 92     err := db.collection.Update(bson.M{"_id":                                                                                                                       
 93         bson.ObjectIdHex(vars["id"])}, bson.M{"$set": &book})
 94 
 95     if err != nil {
 96         w.WriteHeader(http.StatusOK)
 97         w.Write([]byte(err.Error()))
 98     } else {
 99         w.Header().Set("Content-Type","text")
100         w.Write([]byte("Update succesfully"))
101     }
102 }
103 
104 
105 //DeleteBook removes the data from the db                                                                                                                           
106 func (db *DBSession) DeleteBook (w http.ResponseWriter, r *http.Request){
107      vars := mux.Vars(r)
108      err := db.collection.Remove(bson.M{"_id":
109          bson.ObjectIdHex(vars["id"])})
110      if err != nil {
111          w.WriteHeader(http.StatusOK)
112          w.Write([]byte(err.Error()))
113      } else {
114          w.Header().Set("Content-Type", "text")
115          w.Write([]byte("Delete Succesfully"))
116      }
117 }
118 
119 func main() {
120     l := hclog.Default()
121     session, err := mgo.Dial("127.0.0.1")
122     c := session.DB("booksdb").C("books")
123     db := &DBSession{session: session, collection:c}
124     addr := "127.0.0.1:8000"
125     if err != nil {
126         panic(err)
127     }
128     defer session.Close()
129     
130     //logger := log.New(os.Stdout, "", log.Ldate | log.Ltime)
131     // Create a new router
132     r := mux.NewRouter()
133 
134     //Attach an elegant path with handler
135     r.HandleFunc("/api/books/{id:[a-zA-Z0-9]*}", db.GetBook).Methods("GET")
136     r.HandleFunc("/api/books", db.PostBook).Methods("POST")
137     r.HandleFunc("/api/books/{id:[a-zA-Z0-9]*}", db.UpdateBook).Methods("PUT")
138     r.HandleFunc("/api/books/{id:[a-zA-Z0-9]*}", db.DeleteBook).Methods("DELETE")
139 
140     srv := &http.Server{
141         Handler:       r,
142         Addr:          addr,
143         ErrorLog:      l.StandardLogger(&hclog.StandardLoggerOptions{}),
144         IdleTimeout:   time.Minute,
145         WriteTimeout:  15 * time.Second,
146         ReadTimeout:   15 * time.Second,
147     }                                                                                                                                                               
148 
149     //start the server
150     go func() {
151       l.Info("Starting server on port 8000 ")
152       err := srv.ListenAndServe()
153       if err != nil {
154           l.Error("Error starting the server :", "error", err)
155           os.Exit(1)
156       }        
157     }()
158 
159 
160     //Trap sigterm or interupt and gracefully shutdown the server
161     ch := make(chan os.Signal, 1)
162     signal.Notify(ch, os.Interrupt)
163     signal.Notify(ch, os.Kill)
164     
165     //Block untill a signal is received
166     sig := <- ch
167     log.Println("Got signal :", sig)
168 
169 
170     //gracefully shutdown the server, waiting max 30 for current operations to complete
171     ctx, _ := context.WithTimeout(context.Background(), 30 * time.Second)
172     srv.Shutdown(ctx)
173 
174 }                                                                                                                                                         
Вход в полноэкранный режим Выйти из полноэкранного режима

Не забудьте выполнить команду «go mod tidy», чтобы привести в порядок все прямые и косвенные зависимости.

В приведенном выше коде мы сначала создаем две структуры, DBSession и Book;

Структура DBSession будет использоваться для хранения нашей сессии базы данных и свойств коллекции драйвера mgo. Структура Book будет хранить данные нашей книги, также обратите внимание, что структура Book имеет вложенную структуру Publisher.

Далее мы определяем метод приемника-указателя для нашей структуры Book, которая должна реализовать интерфейс Handler. В данном случае мы сначала определяем метод GetBook, который извлекает книгу из базы данных, используя идентификатор, предоставленный в качестве части запроса, а затем возвращает этот метод в качестве ответа. Затем мы определяем второй метод под названием PostBook, который делает то, что следует из его названия: он принимает книгу, отправленную в качестве части тела запроса, а затем пытается вставить эту книгу в нашу базу данных. Мы создали еще один метод обработчика под названием UpdateBook, который принимает обновленные значения книги, уже существующей в нашей базе данных, и пытается изменить одно из ее значений. Наш последний обработчик — метод DeleteBook, который использует данные, относящиеся к книге, хранящейся в нашей базе данных. Мы идентифицируем эту конкретную книгу с помощью идентификатора, который отправляется в качестве части запроса.

Затем мы создаем нашу главную функцию, в ней мы инстанцируем сессию с нашей базой данных, которую мы будем использовать для всех наших последующих запросов и обновлений, затем мы создаем новый маршрутизатор, используя метод NewRouter() в gorilla/mux, затем мы присоединяем наши обработчики к этому маршрутизатору, чтобы обеспечить отправку различных запросов к их последующим обработчикам. Затем мы запускаем наш сервер как go-программу, создаем канал для прослушивания и ответа на сигналы завершения работы сервера.

Чтобы добавить новую книгу в нашу базу данных и протестировать конечную точку POST, сделаем пост-запрос к нашему API, откроем терминал из любого места и выполним следующий запрос curl:

mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ curl -X POST 
> http://localhost:8000/api/books 
> -H 'cache-control: no-cache' 
> -H 'content-type: application/json' 
> -H 'postman-token: 6ef9507e-65b3-c3dd-4748-3a2a3e055c9c' 
> -d '{"title" :"A Dance with Dragons","authors":[ "George R.R Martin", "Phyllis Eisenstein"],"publishdate":"August 6,1998","characters":[ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ],"publisher": { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}'

Войти в полноэкранный режим Выйти из полноэкранного режима

Вы получите ответ от сервера API, который будет выглядеть следующим образом:

{"ID":"62ddc5e89c99ea1313ae2568","Title":"A Dance with Dragons","Authors":["George R.R Martin","Phyllis Eisenstein"],"Genre":null,"PublishDate":"August 6,1998","Characters":["Jon Snow","Daenerys Targaryen","Eddard Star","Sansa Stark","Jammie Lannister","Rob Stark","Cerser Lannister"],"publisher": { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}
Вход в полноэкранный режим Выйти из полноэкранного режима

Перейдите в вашу базу данных и подтвердите, что там появилась новая запись, id которой был автоматически сгенерирован MongoDB для нас, это должно выглядеть следующим образом:

{ "_id" : ObjectId("62ddc5e87071de3d88044140"), "id" : ObjectId("62ddc5e89c99ea1313ae2568"), "title" : "A Dance with Dragons", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "genre" : [ ], "publishdate" : "August 6,1998", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}

Войти в полноэкранный режим Выход из полноэкранного режима

Проверим нашу конечную точку GetBook, мы предоставим идентификатор, который был возвращен, когда мы добавили нашу книгу с помощью конечной точки PostBook выше, т.е. в моем случае «62ddc5e89c99ea1313ae2568»:

mykmyk@skynet:~/go/src/github.com/myk4040okothogodo/MongoGorilla$ curl -X GET 
> http://localhost:8000/api/books/62ddc5e89c99ea1313ae2568 
> -H 'cache-control: no-cache' 
> -H 'postman-token: 00282916-e7f8-5977-ea34-d8f89aeb43e2'
Вход в полноэкранный режим Выйти из полноэкранного режима

Это должно вернуться:

{"ID":"62ddc5e89c99ea1313ae2568","Title":"A Dance with Dragons","Authors":["George R.R Martin","Phyllis Eisenstein"],"Genre":[],"PublishDate":"August 6,1998","Characters":["Jon Snow","Daenerys Targaryen","Eddard Star","Sansa Stark","Jammie Lannister","Rob Stark","Cerser Lannister"],"publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" }}
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы проверить конечную точку удаления:

curl -X DELETE http://localhost:8000/api/books/62ddc5e87071de3d88044140
Войти в полноэкранный режим Выйти из полноэкранного режима

должно вернуться:

Delete Successfully
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь, если мы проверим нашу базу данных с помощью команды find(), мы обнаружим, что конкретная книга «Танец с драконами» была удалена, т.е:

> db.books.find()
{ "_id" : 5, "title" : "A Song Of Ice and Fire", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
{ "_id" : ObjectId("62dda3f1457193537fd4d245"), "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }

Войти в полноэкранный режим Выход из полноэкранного режима

Чтобы проверить конечную точку Put, которую мы будем использовать для изменения определенных значений данных о книге:

Я хочу изменить издательство книги «A Feast of Crows» с «Bantam Books» на «Voyager» и удалить одного из авторов «Phyllis Eisenstein».

В настоящее время книга выглядит следующим образом:

{ "_id" : 62dda3f1457193537fd4d245, "title" : "A Feast Of Crows", "authors" : [ "George R.R Martin", "Phyllis Eisenstein" ], "publishdate" : "August 1,1996", "characters" : [ "Jon Snow", "Daenerys Targaryen", "Eddard Star", "Sansa Stark", "Jammie Lannister", "Rob Stark", "Cerser Lannister" ], "publisher" : { "name" : "Bantam Books", "country" : "United States", "website" : "www.randomhousebooks.com" } }
Войти в полноэкранный режим Выход из полноэкранного режима

Подскажите, как изменить данные, подскажите:

 curl -X PUT http://localhost:8000/api/books/.................
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы застряли, напишите об этом в комментариях, и я обязательно помогу.

Заключение
В этой статье мы в основном рассмотрели MongoDB, как установить и добавить данные в нее с помощью интерактивной оболочки, затем мы поговорили о создании простого gorilla-mux api и его взаимодействии с нашей базой данных для хранения, удаления и изменения данных о книгах, отправленных с помощью методов HTTP-запроса PUT, POST, GET и DELETE.

До свидания, до скорой встречи.

Оцените статью
devanswers.ru
Добавить комментарий