多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## mongodb概念介绍 | sql | mongodb | 介绍 | ------------- |:-------------:| -----:| |database| database|数据库| |table|collection| 数据库表/集合 | |row|document|数据记录行/文档| |column|field|数据字段/域| |index|index|索引| |table joins | |表连接,MongoDB不支持 |primary key|primary key|主键,MongoDB自动将_id字段设置为主键| ## 示例 ``` package usemgo import ( "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "fmt" ) type Person struct { Name string Phone string } func UseMgo() { session, err := mgo.Dial("localhost") if err != nil { panic(err) } defer session.Close() c := session.DB("test").C("people") err = c.Insert(&Person{"cc", "13246662437"}) if err != nil { panic(err) } result := Person{} err = c.Find(bson.M{"name": "cc"}).One(&result) if err != nil { panic(err) } fmt.Println("phone", result.Phone) } ``` ## 切换数据库 通过session.DB() 来切换相应的数据库 ``` db := session.DB("test") ``` ##切换集合 通过Database.c() 来切换集合, 这样就可以对集合进行增删改查了 ``` c := db.C("users") ``` ## 插入 ``` err = c.Insert(&User{ Id_: bson.NewObjectId(), Name: "Jimmy Kuu", Age: 33, JoinedAt: time.Now(), Interests: []string{"Develop", "Movie"}, }) if err != nil { panic(err) } err = c.Insert(&User{ Id_: bson.NewObjectId(), Name: "Tracy Yu", Age: 31, JoinedAt: time.Now(), Interests: []string{"Shoping", "TV"}, }) if err != nil { panic(err) } ``` ## 查询所有 ``` var users []User c.Find(nil).All(&users) fmt.Println(users) ``` ## 单条件查询 =($eq) ``` c.Find(bson.M{"name": "Jimmy Kuu"}).All(&users) ``` !=($ne) ``` c.Find(bson.M{"name": bson.M{"$ne": "Jimmy Kuu"}}).All(&users) ``` `>>($gt)` ``` c.Find(bson.M{"age": bson.M{"$gt": 32}}).All(&users) ``` `<($lt)` ``` c.Find(bson.M{"age": bson.M{"$lt": 32}}).All(&users) ``` `>>=($gte)` ``` c.Find(bson.M{"age": bson.M{"$gte": 33}}).All(&users) ``` `<=($lte)` ``` c.Find(bson.M{"age": bson.M{"$lte": 31}}).All(&users) ``` in($in) ``` c.Find(bson.M{"name": bson.M{"$in": []string{"Jimmy Kuu", "Tracy Yu"}}}).All(&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}}}).All(&users) ``` ## 修改 修改字段的值($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"}) ``` ## 正确用法 应该在每次使用时从源session拷贝 ``` func foo2() {     s := session.Copy()     defer s.Close()     s.DB("test").C("coll").Insert(bson.M{"name":"zhangsan"}) } ``` foo2函数从源session拷贝出了一个临时的session,使用临时session写入一条数据,在函数退出时关闭这个临时的session。 ## 原因 所有的Session实例都是线程安全的 mgo自身维护了一套到mongodb集群的连接池。这套连接池机制以mongodb数据库服务器为最小单位,每个mongodb都会在mgo内部,对应一个mongoServer结构体的实例,一个实例代表着mgo持有的到该数据库的连接