go中mgo操作數據庫的一些示例

博客:https://hzeyuan.cn


以前用的python,操作數據庫用的是mongoengine,現在換成了go,發現了一個也挺不錯的操作mongoDB驅動,mgo!

示例github地址:https://github.com/hzeyuan/learnGO/tree/master/mgo-examples


1.mgo的安裝

go get gopkg.in/mgo.v2

github地址: https://github.com/go-mgo/mgo 如今已經停止維護了!

2. 下面是一些實際遇到的一些基本操作

2.0

開始前定義一些基本的變量

  • Posts結構體代表我們要存儲的文章,
  • Seession:連接上mongo
  • Databse:是我們要創建的數據庫名稱
  • Collection:是我們創建的集合名稱
type Posts struct {
	Title string
	Content string
	Date time.Time
}

var (
	Session,_ = mgo.Dial("localhost")
	Database = "mgo"
	Collection = "posts"
	Coll = Session.DB(Database).C(Collection)
)

2.1 刪除數據庫

// Drop Database
func DropDatebase(){
	fmt.Println("drop Database -->")
	if err :=Session.DB(Database).DropDatabase();err!=nil{
		fmt.Println("drop Datebase fail!!")
	}
}

2.2 添加一個文檔

// 添加一個文檔
func TestInsert(){
	fmt.Println("insert document to mongo DB -->")
	post1 := &Posts{
		Title:   "post1",
		Content: "post1-content",
		Date:    time.Now(),
	}
	Coll.Insert(post1)
}

2.3 添加多個文檔

// 添加多個文檔
func TestMultipleInsert(){
	t:=time.Now()
	fmt.Println("insert Multi document -->")
	var multiPosts []interface{}
	for i:=1;i<5001;i++{
		multiPosts = append(multiPosts,&Posts{
			Title:   fmt.Sprintf("post-%d",i),
			Content: fmt.Sprintf("post-%d-content",i),
			Date:    time.Now(),
		})
	}
	Coll.Insert(multiPosts...)
	fmt.Println(time.Since(t))
}

2.4 批量插入多個文檔

//批量插入
func TestBulkInsert(){
	t:=time.Now()
	fmt.Println("Bulk Insert -->")
	b :=Coll.Bulk()
	var bulkPosts []interface{}
	for i:=10;i<5010;i++{
		bulkPosts = append(bulkPosts,&Posts{
			Title:   fmt.Sprintf("post-%d",i),
			Content: fmt.Sprintf("post-%d-content",i),
			Date:    time.Now(),
		})
	}
	b.Insert(bulkPosts...)
	if _,err:=b.Run();err!=nil{
		fmt.Println(err)
	}
	fmt.Println(time.Since(t))
}

2.5 更新文檔

//更新文檔操作
func TestUpdate(){
	fmt.Println("Test Update in mongo DB -->")
	selector := bson.M{"title":"post1"}
	update :=bson.M{"$set":bson.M{"title":"post1-update"}}
	if err := Coll.Update(selector,update);err!=nil{
		fmt.Println(err)
	}
}

2.6 添加或者更新文檔(upsert)

//添加或更新文檔
func TestUpsert() {
	fmt.Println("Test Upsert in Mongo DB -->")

	//添加或者更新文檔
	update := bson.M{"$set": bson.M{"content": "post-upsert-content"}}
	selector := bson.M{"title": "post-upsert-title"}

	_, err := Coll.Upsert(selector, update)
	if err != nil {
		panic(err)
	}
}

2.7 查詢文檔

//查詢文檔
func TestSelect(){
	fmt.Println("Test Select in Mongo DB -->")
	var result Posts
	var results []Posts
	if err:=Coll.Find(bson.M{"title":"post1-update"}).One(&result);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("find one:%v\n",result)
	if err:=Coll.Find(bson.M{"title":"post1-update"}).All(&results);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("find all:%v\n",results)
	if err:=Coll.Find(bson.M{"title":"post1-update"}).All(&results);err!=nil{
		fmt.Println(err)
	}
	if err:=Coll.Find(bson.M{"title":"post1-update"}).Limit(1).All(&results);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("find limit:%v\n",results)
}

2.8 聚合操作

//聚合操作
func TestAggregate(){
	pipeline := []bson.M{
		{"$match": bson.M{"title": "post1-update" }},
	}
	pipe := Coll.Pipe(pipeline)

	result := []bson.M{}
	//err := pipe.AllowDiskUse().All(&result) //allow disk use
	err := pipe.All(&result)
	if err != nil {
		panic(err)
	}
	fmt.Println("find TestAggregate result:", result)
}

2.9 直接將json保存到mongoDB中

func saveJsonToDB(){
	var f interface{}
	j:=[]byte(`{"posts": {
		"title": "post1",
		"content": "post1-content"
	}
}`)
	if err:=json.Unmarshal(j,&f);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("%v",&f)
	if err:=Coll.Insert(&f);err!=nil{
		fmt.Println(err)
	}

}

3.完整代碼

package main

import (
	"encoding/json"
	"fmt"
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"time"
)

type Posts struct {
	Title string
	Content string
	Date time.Time
}

var (
	Session,_ = mgo.Dial("localhost")
	Database = "mgo"
	Collection = "posts"
	Coll = Session.DB(Database).C(Collection)
)

// Drop Database
func DropDatebase(){
	fmt.Println("drop Database -->")
	if err :=Session.DB(Database).DropDatabase();err!=nil{
		fmt.Println("drop Datebase fail!!")
	}
}

// 添加一個文檔
func TestInsert(){
	fmt.Println("insert document to mongo DB -->")
	post1 := &Posts{
		Title:   "post1",
		Content: "post1-content",
		Date:    time.Now(),
	}
	Coll.Insert(post1)

}
// 添加多個文檔
func TestMultipleInsert(){
	t:=time.Now()
	fmt.Println("insert Multi document -->")
	var multiPosts []interface{}
	for i:=1;i<5001;i++{
		multiPosts = append(multiPosts,&Posts{
			Title:   fmt.Sprintf("post-%d",i),
			Content: fmt.Sprintf("post-%d-content",i),
			Date:    time.Now(),
		})
	}
	Coll.Insert(multiPosts...)
	fmt.Println(time.Since(t))
}

//批量插入
func TestBulkInsert(){
	t:=time.Now()
	fmt.Println("Bulk Insert -->")
	b :=Coll.Bulk()
	var bulkPosts []interface{}
	for i:=10;i<5010;i++{
		bulkPosts = append(bulkPosts,&Posts{
			Title:   fmt.Sprintf("post-%d",i),
			Content: fmt.Sprintf("post-%d-content",i),
			Date:    time.Now(),
		})
	}
	b.Insert(bulkPosts...)
	if _,err:=b.Run();err!=nil{
		fmt.Println(err)
	}
	fmt.Println(time.Since(t))
}

//更新文檔操作
func TestUpdate(){
	fmt.Println("Test Update in mongo DB -->")
	selector := bson.M{"title":"post1"}
	update :=bson.M{"$set":bson.M{"title":"post1-update"}}
	if err := Coll.Update(selector,update);err!=nil{
		fmt.Println(err)
	}
}

//添加或更新文檔
func TestUpsert() {
	fmt.Println("Test Upsert in Mongo DB -->")

	//添加或者更新文檔
	update := bson.M{"$set": bson.M{"content": "post-upsert-content"}}
	selector := bson.M{"title": "post-upsert-title"}

	_, err := Coll.Upsert(selector, update)
	if err != nil {
		panic(err)
	}
}

//查詢文檔
func TestSelect(){
	fmt.Println("Test Select in Mongo DB -->")
	var result Posts
	var results []Posts
	if err:=Coll.Find(bson.M{"title":"post1-update"}).One(&result);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("find one:%v\n",result)
	if err:=Coll.Find(bson.M{"title":"post1-update"}).All(&results);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("find all:%v\n",results)
	if err:=Coll.Find(bson.M{"title":"post1-update"}).All(&results);err!=nil{
		fmt.Println(err)
	}
	if err:=Coll.Find(bson.M{"title":"post1-update"}).Limit(1).All(&results);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("find limit:%v\n",results)
}

//聚合操作
func TestAggregate(){
	pipeline := []bson.M{
		{"$match": bson.M{"title": "post1-update" }},
	}
	pipe := Coll.Pipe(pipeline)

	result := []bson.M{}
	//err := pipe.AllowDiskUse().All(&result) //allow disk use
	err := pipe.All(&result)
	if err != nil {
		panic(err)
	}
	fmt.Println("find TestAggregate result:", result)
}

//保存json到mongo
func saveJsonToDB(){
	var f interface{}
	j:=[]byte(`{"posts": {
		"title": "post1",
		"content": "post1-content"
	}
}`)
	if err:=json.Unmarshal(j,&f);err!=nil{
		fmt.Println(err)
	}
	fmt.Printf("%v",&f)
	if err:=Coll.Insert(&f);err!=nil{
		fmt.Println(err)
	}

}
func main(){
	TestInsert()
	TestUpdate()
	TestUpsert()
	TestSelect()
	TestAggregate()
	TestMultipleInsert()
	TestBulkInsert()
	saveJsonToDB()
	defer Session.Close()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章