安装好mongodb后咱们就可以用go来操作mongodb, 进行快乐的CRUD了
安装mogodb驱动
$ go get github.com/mongodb/mongo-go-driver
连接mongodb
// 设置客户端连接配置
clientOptions := options.Client().ApplyURI("mongodb://user:pwd@server:port/db")
// 连接到MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
} else {
fmt.Printf("client %#v \n", client) // client &mongo.Client{...}
}
检查连接
// 检查连接
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
} else {
fmt.Println("Connected to MongoDB!")
}
连接数据集
相当于mysql中的table
// 数据集
collection := client.Database("db").Collection("coder")
fmt.Printf("collection %#v \n", collection) // collection &mongo.Collection{...}
增加一行文档
相当于js的db.coder.insertOne({})
s1 := Coder{"写代码的老哥0", 35}
insertResult, err := collection.InsertOne(context.TODO(), s1)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted a single document: ", insertResult.InsertedID) // ObjectID("5fe81819be51c1175cd95ba3")
用Robo 3T查看
增加多行文档
相当于js的db.coder.insertMany([...])
// 插入多个
s2 := Coder{"写代码的老哥1", 36}
s3 := Coder{"写代码的老哥2", 37}
coders := []interface{}{s2, s3}
insertManyResult, err := collection.InsertMany(context.TODO(), coders)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs) // Inserted multiple documents: [ObjectID("5fe818a70bb1cc7b7b030fe7") ObjectID("5fe818a70bb1cc7b7b030fe8")]
查找一个
相当于js的bd.coder.find(filter)
filter := bson.D{{"name", "写代码的老哥0"}}
var result Coder
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)
查找多个
相当于js的db.coder.find()
// 查询多个
// 将选项传递给Find()
findOptions := options.Find()
findOptions.SetLimit(2)
// 定义一个切片用来存储查询结果
var results []*Coder
// 把bson.D{{}}作为一个filter来匹配所有文档
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
log.Fatal(err)
}
// 查找多个文档返回一个游标
// 遍历游标允许我们一次解码一个文档
for cur.Next(context.TODO()) {
// 创建一个值,将单个文档解码为该值
var elem Coder
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
results = append(results, &elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
// 完成后关闭游标
cur.Close(context.TODO())
fmt.Printf("Found multiple documents (array of pointers): %#v\n", results)
for index, coder := range results {
fmt.Printf("coder %v name %v age %v \n", index, coder.Name, coder.Age)
}
更新
相当于js的db.coder.update(...)
// 查找过滤
filter := bson.D{{"name", "写代码的老哥0"}}
// 更新
update := bson.D{
{"$inc", bson.D{
{"age", 1},
}},
}
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Matched %v documents and updated %v documents. \n", updateResult.MatchedCount, updateResult.ModifiedCount)
删除一个
相当于js的db.coder.deleteOne(...)
deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name","写代码的老哥0"}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the collection\n", deleteResult1.DeletedCount)
删除多个
相当于js的db.coder.drop()
// 删除所有
deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the collection\n", deleteResult2.DeletedCount)
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!