这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
mongoDB
mongoDB是一个基于分布式文件存储的数据库介于关系数据库和非关系数据库之间
将一条数据存储为一个文档, 其中文档相当于JSON对象
mongoDB和关系型数据库概念对比
SQL | MongoDB | 说明 |
---|---|---|
databse | database | 数据库 |
table | collection | 数据集 |
row | document | 文档 |
column | field | 字段 |
mongoDB的安装
使用brew命令来安装
第一步安装mongodb/brew
brew tap mongodb/brew
复制代码
第二步安装mongodb
brew install mongodb-community
复制代码
mongoDB的开启
mongod --config /usr/local/etc/mongod.conf
复制代码
下载mongoDB的驱动
go get github.com/mongodb/mongo-go-driver
复制代码
导入mongoDB驱动包
import (
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
复制代码
连接mongoDB
// 定义一个全局的数据集
var (
collection *mongo.Collection
)
// Student 定义一个结构体
type Student struct {
Name string
Age int64
}
// 连接mongodb
opt := options.Client().ApplyURI("mongodb://localhost:27017")
c, err := mongo.Connect(context.TODO(), opt)
if err != nil {
fmt.Println("mongo connect failed: ", err)
return
}
fmt.Println("mongo connect succeed!")
// 检查连接
err = c.Ping(context.TODO(), nil)
if err != nil {
fmt.Println("mongo ping failed: ", err)
return
}
fmt.Println("mongo ping succeed!")
// 从数据库go_mongo, 获取student表
collection = c.Database("go_mongo").Collection("student")
// 关闭连接
defer func() {
fmt.Println("mongo closed!")
c.Disconnect(context.TODO())
}()
复制代码
添加一条数据
使用InsertOne()方法向数据集中插入一条文档数据
func insertData() {
// 创建一个结构体实例
s1 := Student{
Name: "shaosiming",
Age: 18,
}
res, err := collection.InsertOne(context.TODO(), s1)
if err != nil {
fmt.Println("collection insert one data failed: ", err)
return
}
fmt.Println("collection insert one data succeed!")
fmt.Println(res)
}
复制代码
添加多条数据
使用insertMany()方法向数据集中添加多条文档数据
/* 添加多条数据 */
func insertManyData() {
// 定义两个Student实例
s1 := Student{
Name: "tianming",
Age: 18,
}
s2 := Student{
Name: "dasiming",
Age: 20,
}
// 调用InsertMany方法将数据添加到数据集中
res, err := collection.InsertMany(context.TODO(), []interface{}{s1, s2})
if err != nil {
fmt.Println("collection insert many data failed: ", err)
return
}
fmt.Println("collection insert many data succeed!")
fmt.Println(res)
}
复制代码
删除一条数据
使用DeleteOne()方法删除数据集中的跟过滤器匹配的第一条数据
func deleteData() {
// 创建一个过滤器, 用来查找age为28的文档数据
filter := bson.D{{"age", 28}}
// 删除跟过滤器相匹配的第一条数据
res, err := collection.DeleteOne(context.TODO(), filter)
if err != nil {
fmt.Println("collection delete failed: ", err)
return
}
fmt.Println("collection delete succeed!")
fmt.Println(res)
}
复制代码
删除多条数据
调用DeleteMany()方法删除跟过滤器相匹配的全部文档数据
func deleteManyData() {
filter := bson.D{{"age", 18}}
res, err := collection.DeleteMany(context.TODO(), filter)
if err != nil {
fmt.Println("collection delete failed: ", err)
return
}
fmt.Println("collection delete succeed!")
fmt.Println(res)
}
复制代码
更新数据
func updateData() {
// 过滤器, 匹配name为dasiming的文档
filter := bson.D{{"name", "dasiming"}}
// 将匹配的文档进行更新, 设置age字段为10
update := bson.D{
{
"$set", bson.D{
{"age", 10},
},
},
}
res, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
fmt.Println("collection udpate failed: ", err)
return
}
fmt.Println("collection update succeed!")
fmt.Println(res)
}
复制代码
查找一条数据
使用FindOne()方法查找跟过滤器相匹配的第一条文档数据
func queryData() {
filter := bson.D{
{"name", "shaosiming"},
//{"age", 18},
}
var stu Student
err := collection.FindOne(context.TODO(), filter).Decode(&stu)
if err != nil {
fmt.Println("collection find failed: ", err)
return
}
fmt.Println(stu)
}
复制代码
查找多条数据
/* 查询多条数据 */
func queryManyData() {
// 定义一个筛选器, 来查找age为18的文档
filter := bson.D{
{"name", "tianming"},
}
// Find方法用来查找多条数据
cur, err := collection.Find(context.TODO(), filter)
if err != nil {
fmt.Println("collection find failed: ", err)
return
}
fmt.Println(cur)
// 存储经过Decode的数据
var stus []*Student
// 用来接收每次解码得到的结果
var stu Student
// 通过循环游标的Next()方法来获取查找到的数据
for cur.Next(context.TODO()) {
err = cur.Decode(&stu)
if err != nil {
fmt.Println("cur decode failed: ", err)
return
}
stus = append(stus, &stu)
fmt.Println(stu)
}
// 关闭游标
defer func() {
fmt.Println("cursor closed!")
cur.Close(context.TODO())
}()
// 查看结果
fmt.Println("查询到的学生姓名为tianming的有: ", stus)
for i, student := range stus {
fmt.Println(i, ": ", student.Name)
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END