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()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值