go语言连接mongoDB

go语言连接mongoDB,第1张

文章目录 官网安装Docker安装mongo基本命令GO基本连接测试GO微服务连接

官网安装

mongodb官网安装:https://docs.mongodb.com/manual/administration/install-on-linux/

Docker安装
docker search mongo
docker pull mongo
docker run -p 27017:27017 -d mongo:latest
docker exec -it containerID /bin/bash
# 实 *** 如下
[root@k8s101 ~]# docker search mongo
NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mongo                                                  MongoDB document databases provide high avai…   8611      [OK]       
mongo-express                                          Web-based MongoDB admin interface, written w…   1146      [OK]       
bitnami/mongodb                                        Bitnami MongoDB Docker Image                    173                  [OK]
mongoclient/mongoclient                                Official docker image for Mongoclient, featu…   107                  [OK]
percona/percona-server-mongodb                         Percona Server for MongoDB docker images        35                   
mongooseim/mongooseim                                  Small docker image for MongooseIM - robust a…   20                   
circleci/mongo                                         CircleCI images for MongoDB                     10                   [OK]
bitnami/mongodb-sharded                                                                                6                    
bitnami/mongodb-exporter                                                                               6                    
percona/percona-server-mongodb-operator                mongod image for PSMDB operator                 4                    
mongodbsap/mongodbdocker                                                                               2                    
rancher/mongodb-conf                                                                                   2                    
ibmcom/mongodb-ppc64le                                                                                 1                    
percona/mongodb_exporter                               A Prometheus exporter for MongoDB including …   1                    
ibmcom/mongodb                                                                                         1                    
ibmcom/mongodb-amd64                                                                                   0                    
ibmcom/mongo-java-driver-ppc64le                       Docker image for mongo-java-driver-ppc64le      0                    
ibmcom/mongodb-exporter-ppc64le                                                                        0                    
ibmcom/mongo-c-driver                                                                                  0                    
ibmcom/mongo-java-driver                                                                               0                    
ibmcom/mongodb-s390x                                                                                   0                    
ibmcom/mongo-c-driver-ppc64le                          Docker image for mongo-c-driver-ppc64leDocke…   0                    
rancher/mongodb-config                                                                                 0                    
mongodb/mongodb-atlas-kubernetes-operator                                                              0                    
mongodb/mongodb-atlas-kubernetes-operator-prerelease   This is a MongoDB Atlas Operator image built…   0                    
[root@k8s101 ~]# docker pull mongo
Using default tag: latest
latest: Pulling from library/mongo
7c3b88808835: Pull complete 
48a403577c28: Pull complete 
76bbb7dc9013: Pull complete 
e81b1e5a386b: Pull complete 
7bdc1db49ec9: Pull complete 
7b2f602f894c: Pull complete 
627a84bea5f4: Pull complete 
fc06fa2a9f52: Pull complete 
0133c89ee92b: Pull complete 
4e990167b745: Pull complete 
Digest: sha256:03ef0031c1642df26d9d3efa9d57e24929672e1ae7aba5818227752089adde36
Status: Downloaded newer image for mongo:latest
docker.io/library/mongo:latest
[root@k8s101 ~]# docker run -p 27017:27017 -d mongo:latest
44a8d8b4a29d38925b5a25da8ae1e9a92f37e18ea1a2ba4ca1ad06ca00e8b501
[root@k8s101 ~]# docker exec -it 44a8d8b4a /bin/bash
root@44a8d8b4a29d:/# mongo
MongoDB shell version v5.0.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("1a4f4b84-0717-48f9-b78a-90dd39c9d50a") }
MongoDB server version: 5.0.6
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
Welcome to the MongoDB shell.
...
mongo基本命令
# mongodb-shell
## 插入测试数据
> db.students.insert({"name": "Bob", "age": 22})
> db.students.insert({"name": "Aollen", "age": 21})
> db.students.insert({"name": "tom", "age": 20})

## 查看有哪些数据
> db.students.find()
{ "_id" : ObjectId("5a1632029d83b8def7401005"), "name" : "Bob", "age" : 22 }
{ "_id" : ObjectId("5a16c89f4da8732f195b4000"), "name" : "Aollen", "age" : 21 }
{ "_id" : ObjectId("5a16c8b74da8732f195b4001"), "name" : "tom", "age" : 20 }
## 查看所有
> db.students.find()
{ "_id" : ObjectId("5a1632029d83b8def7401005"), "name" : "Bob", "age" : 22 }
## 查看指定某个
> db.students.find({"name": "Bob"});
{ "_id" : ObjectId("5a1632029d83b8def7401005"), "name" : "Bob", "age" : 22 }
## 查看指定对象的指定字段(注意 1:代表要展现该字段, 0: 代表不展现该字段, 默认"_id"为要展示)
> db.students.find({"name": "Bob"}, {"age": 1, "_id": 0});
{ "age" : 22 }

# 更新指定对象
> db.students.update({"name": "Bob"}, {$set:{"age": 32}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
# 按条件更新匹配到的第一条(SQL Where)
> db.students.update({"age": {$gt: 20}}, {$set:{"age": 30}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
# 按条件更新匹配到的所有(SQL Where)
> db.students.update({"age": {$gt: 20}}, {$set:{"age": 30}}, false, true)
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })

# 删除指定的对象
> db.students.remove({"name": "Bob"})
WriteResult({ "nRemoved" : 1 })
# 删除该collection里面的所有对象
> db.students.remove({})
WriteResult({ "nRemoved" : 2 })
GO基本连接测试
package main

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"log"
)

func main() {
	fmt.Println("mongo连接测试1")
	TestConn1()
	fmt.Println("mongo连接测试2")
	TestConn2()
}

func TestConn1() {
	// 设置客户端连接配置
	clientOptions := options.Client().ApplyURI("mongodb://192.168.168.101:27017")

	// 连接到MongoDB
	client, err := mongo.Connect(context.TODO(), clientOptions)
	if err != nil {
		log.Fatal(err)
	}

	// 检查连接
	err = client.Ping(context.TODO(), nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Connected to MongoDB!")
}

func TestConn2() {
	session, err := mgo.Dial("mongodb://192.168.168.101:27017/")
	if err != nil {
		panic(err)
	}
	defer session.Close()
	// Optional. Switch the session to a monotonic behavior.
	session.SetMode(mgo.Monotonic, true)
	c := session.DB("test").C("people")
	err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
		&Person{"Cla", "+55 53 8402 8510"})
	if err != nil {
		log.Fatal(err)
	}
	result := Person{}
	err = c.Find(bson.M{"name": "Ale"}).One(&result)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Phone:", result.Phone)
}

type Person struct {
	Name  string
	Phone string
}

GO微服务连接
package main

import (
	"encoding/json"
	"fmt"
	"github.com/julienschmidt/httprouter"
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"log"
	"net/http"
)

func main() {
	session, err := mgo.Dial("192.168.168.101:27017")
	if err != nil {
		panic(err)
	}
	defer session.Close()
	session.SetMode(mgo.Monotonic, true)
	ensureIndex(session)
	router := httprouter.New()
	router.GET("/books", allBooks(session))
	router.POST("/books", addBook(session))
	router.GET("/books/:isbn", bookByISBN(session))
	router.PUT("/books/:isbn", updateBook(session))
	router.DELETE("/books/:isbn", deleteBook(session))
	http.ListenAndServe("localhost:8080", router)
}

func ErrorWithJSON(w http.ResponseWriter, message string, code int) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.WriteHeader(code)
	fmt.Fprintf(w, "{message: %q}", message)
}
func ResponseWithJSON(w http.ResponseWriter, json []byte, code int) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.WriteHeader(code)
	w.Write(json)
}

type Book struct {
	ISBN    string   `json:"isbn"`
	Title   string   `json:"title"`
	Authors []string `json:"authors"`
	Price   string   `json:"price"`
}

func ensureIndex(s *mgo.Session) {
	session := s.Copy()
	defer session.Close()
	c := session.DB("store").C("books")
	index := mgo.Index{
		Key:        []string{"isbn"},
		Unique:     true,
		DropDups:   true,
		Background: true,
		Sparse:     true,
	}
	err := c.EnsureIndex(index)
	if err != nil {
		panic(err)
	}
}
func allBooks(s *mgo.Session) func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		session := s.Copy()
		defer session.Close()
		c := session.DB("store").C("books")
		var books []Book
		err := c.Find(bson.M{}).All(&books)
		if err != nil {
			ErrorWithJSON(w, "Database error", http.StatusInternalServerError)
			log.Println("Failed get all books: ", err)
			return
		}
		respBody, err := json.MarshalIndent(books, "", "  ")
		if err != nil {
			log.Fatal(err)
		}
		ResponseWithJSON(w, respBody, http.StatusOK)
	}
}
func addBook(s *mgo.Session) func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		session := s.Copy()
		defer session.Close()
		var book Book
		decoder := json.NewDecoder(r.Body)
		err := decoder.Decode(&book)
		if err != nil {
			ErrorWithJSON(w, "Incorrect body", http.StatusBadRequest)
			return
		}
		c := session.DB("store").C("books")
		err = c.Insert(book)
		if err != nil {
			if mgo.IsDup(err) {
				ErrorWithJSON(w, "Book with this ISBN already exists", http.StatusBadRequest)
				return
			}
			ErrorWithJSON(w, "Database error", http.StatusInternalServerError)
			log.Println("Failed insert book: ", err)
			return
		}
		w.Header().Set("Content-Type", "application/json")
		w.Header().Set("Location", r.URL.Path+"/"+book.ISBN)
		w.WriteHeader(http.StatusCreated)
	}
}
func bookByISBN(s *mgo.Session) func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		session := s.Copy()
		defer session.Close()
		isbn := ps.ByName("isbn")
		c := session.DB("store").C("books")
		var book Book
		err := c.Find(bson.M{"isbn": isbn}).One(&book)
		if err != nil {
			ErrorWithJSON(w, "Database error", http.StatusInternalServerError)
			log.Println("Failed find book: ", err)
			return
		}
		if book.ISBN == "" {
			ErrorWithJSON(w, "Book not found", http.StatusNotFound)
			return
		}
		respBody, err := json.MarshalIndent(book, "", "  ")
		if err != nil {
			log.Fatal(err)
		}
		ResponseWithJSON(w, respBody, http.StatusOK)
	}
}
func updateBook(s *mgo.Session) func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		session := s.Copy()
		defer session.Close()
		isbn := ps.ByName("isbn")
		var book Book
		decoder := json.NewDecoder(r.Body)
		err := decoder.Decode(&book)
		if err != nil {
			ErrorWithJSON(w, "Incorrect body", http.StatusBadRequest)
			return
		}
		c := session.DB("store").C("books")
		err = c.Update(bson.M{"isbn": isbn}, &book)
		if err != nil {
			switch err {
			default:
				ErrorWithJSON(w, "Database error", http.StatusInternalServerError)
				log.Println("Failed update book: ", err)
				return
			case mgo.ErrNotFound:
				ErrorWithJSON(w, "Book not found", http.StatusNotFound)
				return
			}
		}
		w.WriteHeader(http.StatusNoContent)
	}
}
func deleteBook(s *mgo.Session) func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		session := s.Copy()
		defer session.Close()
		isbn := ps.ByName("isbn")
		c := session.DB("store").C("books")
		err := c.Remove(bson.M{"isbn": isbn})
		if err != nil {
			switch err {
			default:
				ErrorWithJSON(w, "Database error", http.StatusInternalServerError)
				log.Println("Failed delete book: ", err)
				return
			case mgo.ErrNotFound:
				ErrorWithJSON(w, "Book not found", http.StatusNotFound)
				return
			}
		}
		w.WriteHeader(http.StatusNoContent)
	}
}

go微服务连接测试
# 微服务测试
# 创建一本book
curl -X POST http://localhost:8080/books -H 'content-type: application/json' -d '{"isbn": "aabbxx", "title": "test titile", "authors":["bob", "aollen"], "price": "100"}'
# 查看创建的book列表
curl -X GET http://localhost:8080/books
[
  {
    "isbn": "aabbxx",
    "title": "test titile",
    "authors": [
      "bob",
      "aollen"
    ],
    "price": "100"
  }
]
# 查看指定的book
curl -X GET http://localhost:8080/books/aabbxx
{
  "isbn": "aabbxx",
  "title": "test titile",
  "authors": [
    "bob",
    "aollen"
  ],
  "price": "100"
}
# 更新指定的book
curl -X PUT http://localhost:8080/books/aabbxx -H 'content-type: application/json' -d '{"isbn": "aabbxx", "price": "99"}'
# 删除指定的book
curl -X DELETE http://localhost:8080/books/aabbxx

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990197.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存