## 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持有的到该数据库的连接
- 命令行库cobra
- 用户路径检测go-homedir
- 配置解决方案viper(cobra配置用)
- 高效结构化日志库zap
- RPC框架grpc
- mongdb操作mgo
- ORM库xorm
- GRPCrest接口grpcgateway
- 使用gogoproto时grpcgateway的protobuf和json转换方法
- sync.Map
- zmq
- gogoproto
- go类型转换和类型断言
- go select用法详解以及定时器
- go并发资源竞争
- 官方命令行库flag
- 配置文件解析器 robig/config
- interface {} 接口
- goroutine && channel
- go 命名
- 类型switch
- 数据
- 初始化
- 指针方法 && 值方法
- 内嵌
- mqtt go实现
- grpc middleware