好友
阅读权限10
听众
最后登录1970-1-1
|
XMQ
发表于 2021-10-13 16:08
go mongo
1. 定义
mongodb 是 NoSql 数据库,通常的Sql遵循ACID原则,即原子性/一致性/独立性/持久性,而NoSql并不需要遵循此原则。与一般sql相比,Nosql最大的区别在于存储数据的灵活性,通过键值对形式储存。可以存储复杂的数据格式,以二进制形式存储,免去sql分表,联查的麻烦。而mongodb是Nosql中使用最广泛的,是一个基于分布式开源的数据库文件系统,由C++编写。具有高性能,高可用和可伸缩性。
2. 基本操作
安装/下载 自行百度~~
这里列出常用的一些命令,其余可查看官网文档。
show dbs; | 显示当前所有数据库 | use xxxx | 切换到xxx数据库 | show collections; | 查看数据库中所有的数据集 | db.collection.find()
db.collection.find().pretty() //精简显示
db.collection.find({key:value}) // 查找指定数据
db.collection.find({key:value}).count() //查看相应的数量
| 查看数据集详细信息 | db.collection.insert(doc) #doc 指查询条件 | 像数据集插入一条数据 | db.collection.deleteOne(doc)
db.collection.deleteMany(doc) | 删除一条相应数据集数据
删除多条相应数据集数据 | db.collection.update(doc,update) # update 指更新内容 | 更新相应的数据集 | db.getCollectionNames(); | 显示当前数据集所有数据集 | db.version()
| 查看db版本 | db.dropDatabase(); | 删除当前数据库 | 3. go 操作mongodb (在mongodb每插入一条数据,除了特殊指定外,每条数据都会自动生成一个_id 即ObjectId。类似sql的自增id)
3.1 下载相关依赖包
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
3.2 连接,在连接时我们使用context.WithTimeout,如果连接超时就自动取消。
func ConnectToDB(url,name string,timeout time.Duration,num uint64)(*mongo.Database,error){ ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel() // 最后关闭
o := options.Client().ApplyURI(url)
o.SetMaxPoolSize(num) //设置最大连接数
client, err := mongo.Connect(ctx, o)
if err != nil {
return nil, err
}
return client.Database(name), nil //这里直接返回对应数据库的指针
} |
调用
myClient, err := ConnectToDB("mongodb://127.0.0.1:27017","bigdata",10,100) //地址,数据库名称,连接数量if err != nil {
fmt.Println("数据库连接失败")
} |
获取对应数据集,接下来就可以对这个数据集进行增删改查等操作
collection := myClient.Collection("grade") | 插入,先创建相应的结构体,赋值并插入数据集 type Grade struct { Id primitive.ObjectID `json:"_id" bson:"_id"` //返回_id
Grade_id int `json:"grade_id"`
Money int `json:"money"`
} | s2 := rep.Grade{ Id: primitive.NewObjectID(),
Grade_id: 1,
Money: 500,
}
insertResult, err := collection.InsertOne(context.TODO(), s2) // 插入一条数据,使用collection.InsertMany可插入多条数据if err != nil {
log.Print(err)
fmt.Println("err",err)
return
}
fmt.Println("Inserted a single document: ", insertResult.InsertedID) | 更新 (需要定义查询条件/过滤条件和更新内容)//过滤条件: filter := bson.D{{"Grade_id",1}}
// 更新内容update := bson.D{
{"$set", bson.D{
{"Money", 999},
}},} | updateResult, err := collection.UpdateMany(context.TODO(),filter,update) // 更新多条数据if err != nil {
log.Print(err)
fmt.Println("err",err)
return
} | 删除deleteResult, err := collection.DeleteMany(context.TODO(), filter2)fmt.Println("deleteResult",deleteResult) | 查询也是一样err = collection.FindOne(context.TODO(),filter).Decode(&img) | 查询一条数据,并且自定义返回格式img | cursor,err := collection.Aggregate(context.TODO(),filter) //获取游标defer cursor.Close(context.TODO()) //最后关闭游标
if err = cursor.All(context.TODO(),&img) //获取全部数据
err != nil {
fmt.Println("cursor_err",err)
}
var h []Grade //新建一个空list
for _, result := range img{ //遍历
h = append(h,Grade{
Grade_id: result.Datas[1].ImageTitle, //添加数据
Money: result.Datas[1].ImagePath,
})
} | 获取过滤条件全部数据 | 还有一个通过ObjectId来查询。oid ,err:= primitive.ObjectIDFromHex("6160224cd05c21cf50e1bca3"); | 获取ObijectId | filter2 :=bson.M{"_id":oid}err = collection.FindOne(context.TODO(),filter2).Decode(&img) | | 以上是简单的增删改查操作.ObjectId 的其他用法: id := bson.NewObjectId() | 生成新的ObjectId | idTime := id.Time() | 从ObjectId中获取时间戳 | idMac := id.Machine() | 从ObjectId中获取机器码 | idPid := id.Pid() | 从ObjectId中获取进程id | idCount := id.Counter() | 从OjbectId中获取随机数 |
|
|