商业公链之区块链技术使用的常见库(六)------Go语言文档数据库"gopkg.in/mgo.v2"

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

1.安装mgo:go get gopkg.in/mgo.v2

2.导入mgo包

import ( 

"gopkg.in/mgo.v2" 

"gopkg.in/mgo.v2/bson" 

)

3.通过方法Dial()来和MongoDB服务器建立连接。Dial()定义如下:

func Dial(url string) (*Session, error)

具体使用:

session, err := mgo.Dial(url)

如果是本机,并且MongoDB是默认端口27017启动的话,下面几种方式都可以。

session,err:=mgo.Dial("")

session,err:=mgo.Dial("localhost")

session,err:=mgo.Dial("127.0.0.1")

session,err:=mgo.Dial("localhost:27017")

session,err:=mgo.Dial("127.0.0.1:27017")

如果不在本机或端口不同,传入相应的地址即可。如:

mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb

4.切换数据库,通过Session.DB()来切换相应的数据库。

func (s *Session) DB(name string) *Database

如切换到test数据库。

db := session.DB("test")

5.切换集合,通过Database.C()方法切换集合(Collection),这样我们就可以通过对集合进行增删查改操作了。

func (db *Database) C(name string) *Collection

如切换到`users`集合。

c := db.C("users")

 6.定义插入的数据结构,ser的字段首字母大写,不然不可见。通过bson:”name”这种方式可以定义MongoDB中集合的字段名,如果不定义,mgo自动把struct的字段名首字母小写作为集合的字段名。如果不需要获得id_,Id_可以不定义,在插入的时候会自动生成,MongoDB每个集合都会一个名为_id的主键,这是一个24位的16进制字符串。对应到mgo中就是bson.ObjectId。:

//定义一个struct,用来和集合对应。

type User struct

{

Id_ bson.ObjectId `bson:"_id"`

Name string `bson:"name"`

Age int `bson:"age"`

JonedAt time.Time `bson:"joned_at"`

Interests []string `bson:"interests"`

}

7.插入数据,插入方法定义如下:

func (c *Collection) Insert(docs ...interface{}) error

下面代码插入两条集合数据。

err = c.Insert(&User{ Id_: bson.NewObjectId(),

Name: "Jimmy Kuu", 

Age: 33, 

JoinedAt: time.Now(),

Interests: []string{"Develop", "Movie"}, }

if err != nil { 

panic(err) 

8.查询数据,通过func (c *Collection) Find(query interface{}) *Query来进行查询,返回的Query struct可以有附加各种条件来进行过滤。通过Query.All()可以获得所有结果,通过Query.One()可以获得一个结果,注意如果没有数据或者数量超过一个,One()会报错。条件用bson.M{key: value},注意key必须用MongoDB中的字段名,而不是struct的字段名。

无条件查询,查询所有,但输出时注意。

var users []User c.Find(nil).All(&users) fmt.Println(users)

上面代码可以把所有Users都查出来:

根据ObjectId查询

id := "5204af979955496907000001"

objectId := bson.ObjectIdHex(id)

user := new(User)

c.Find(bson.M{"_id": objectId}).One(&user)

fmt.Println(user)

更简单的方式是直接用FindId()方法:

c.FindId(objectId).One(&user)

=($eq)

c.Find(bson.M{"name": "Jimmy Kuu"}).One(&users)

!=($ne)

c.Find(bson.M{"name": bson.M{"$ne": "Jimmy Kuu"}}).Onel(&users)

>($gt)

c.Find(bson.M{"age": bson.M{"$gt": 32}}).One(&users)

多条件查询,and($and)

c.Find(bson.M{"name": "Jimmy Kuu", "age": 33}).All(&users)

or($or)

c.Find(bson.M{"$or": []bson.M{bson.M{"name": "Jimmy Kuu"}, bson.M{"age": 31}}}).A

10.修改数据,通过func (*Collection) Update来进行修改操作。

 

func (c *Collection) Update(selector interface{}, change interface{}) error

注意修改单个或多个字段需要通过$set操作符号,否则集合会被替换。

修改字段的值($set)

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$set": bson.M{ "name": "Jimmy Gu", "age": 34, }})

inc($inc)

字段增加值

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$inc": bson.M{ "age": -1, }})

push($push)

从数组中增加一个元素

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$push": bson.M{ "interests": "Golang", }})

pull($pull)

从数组中删除一个元素

c.Update(bson.M{"_id": bson.ObjectIdHex("5204af979955496907000001")}, bson.M{"$pull": bson.M{ "interests": "Golang", }})

删除

c.Remove(bson.M{"name": "Jimmy Kuu"})

11.关闭数据库连接:defer session.Close()

12.设置数据库一致性模式:session.SetMode(mgo.Monotonic, true),session设置的模式分别为:

Strong

session 的读写一直向主服务器发起并使用一个唯一的连接,因此所有的读写操作完全的一致。

Monotonic

session 的读操作开始是向其他服务器发起(且通过一个唯一的连接),只要出现了一次写操作,session 的连接就会切换至主服务器。由此可见此模式下,能够分散一些读操作到其他服务器,但是读操作不一定能够获得最新的数据。

Eventual

session 的读操作会向任意的其他服务器发起,多次读操作并不一定使用相同的连接,也就是读操作不一定有序。session 的写操作总是向主服务器发起,但是可能使用不同的连接,也就是写操作也不一定有序。

本文源码:阅读原文,用法文档:https://godoc.org/gopkg.in/mgo.v2

希望大家关注我的微信公众号,推荐给更多技术极客,日更一篇区块链技术博客不易,有疑问可以后台留言。

你可能感兴趣的:(区块链(Blockchain),Go,商业公链解码)