一、数据库连接URI
1.单机版:"mongodb://ip:port"
2.副本集:"mongodb://localhost:27017,localhost:27018/?replicaSet=replset"
3.分片集群:"mongodb://localhost:27017,localhost:27018"
二、数据库连接(单机版)
func init() {
var err error
clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
client, err = mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatalln(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatalln(err)
}
}
三、插入
func insert() {
col := client.Database("my_db").Collection("my_col")
//插入单条
ret, err := col.InsertOne(context.TODO(), &Person{Name: "zhang3", Age: 10})
if err != nil {
log.Fatalln(err)
}
fmt.Println(ret.InsertedID)
//插入多条
rets, err := col.InsertMany(context.TODO(), []interface{}{
&Person{Name: "li4", Age: 20},
&Person{Name: "wang5", Age: 21},
})
if err != nil {
log.Fatalln(err)
}
fmt.Println(rets.InsertedIDs)
}
四、查询
Go Driver有两种系列用于表示BSON数据:D系列类型和Raw系列类型。
D系列包括四种类型:
D:BSON文档。此类型应用在顺序很重要的场景下,例如MongoDB命令。
M:无序map。除不保留顺序外,与D相同。
A:一个BSON数组。
E:D中的单个元素。
func FindOne() {
fmt.Println("FindOne:")
col := client.Database("my_db").Collection("my_col")
var p Person
//查询单条记录
err := col.FindOne(context.TODO(), bson.D{{"name", "zhang3"}}).Decode(&p)
if err != nil {
log.Fatalln(err)
}
fmt.Println(p)
}
func Find() {
fmt.Println("Find:")
opt := options.Find()
opt.SetLimit(5)
col := client.Database("my_db").Collection("my_col")
//Find查询多条记录,将会返回一个迭代器,使用完记得关闭
cor, err := col.Find(context.TODO(), bson.D{{"name", "zhang3"}}, opt)
if err != nil {
log.Fatalln(err)
}
defer cor.Close(context.TODO())
for cor.Next(context.TODO()) {
var p Person
cor.Decode(&p)
fmt.Println(p)
}
}
五、更新
func updateOne() {
//条件
filter := bson.D{{"name", "zhang3"}}
//如果匹配不存在,则插入
opts := options.Update().SetUpsert(true)
//执行的动作
update := bson.D{
{"$set", bson.D{
{"age", 22}},
},
}
col := client.Database("my_db").Collection("my_col")
ret, err := col.UpdateOne(context.TODO(), filter, update, opts)
if err != nil {
log.Fatalln(err)
}
if ret.MatchedCount != 0 {
fmt.Println("matched", ret.MatchedCount)
}
if ret.UpsertedCount != 0 {
fmt.Println("insert", ret.UpsertedCount)
}
}
func update() {
//条件
filter := bson.D{{"name", "zhang3"}}
//如果匹配不存在,则插入
opts := options.Update().SetUpsert(true)
//执行的动作
update := bson.D{
{"$set", bson.D{
{"age", 22}},
},
}
col := client.Database("my_db").Collection("my_col")
ret, err := col.UpdateMany(context.TODO(), filter, update, opts)
if err != nil {
log.Fatalln(err)
}
if ret.MatchedCount != 0 {
fmt.Println("matched", ret.MatchedCount)
}
if ret.UpsertedCount != 0 {
fmt.Println("insert", ret.UpsertedCount)
}
}
六、删除
func remove() {
filter := bson.D{{"name", "zhang3"}}
col := client.Database("my_db").Collection("my_col")
ret, err := col.DeleteMany(context.TODO(), filter)
if err != nil {
log.Fatalln(err)
}
fmt.Printf("remove %d records\n", ret.DeletedCount)
}
七、总体代码:
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type Person struct {
Name string
Age int
}
var client *mongo.Client
func init() {
var err error
clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
client, err = mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatalln(err)
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatalln(err)
}
}
func insert() {
col := client.Database("my_db").Collection("my_col")
ret, err := col.InsertOne(context.TODO(), &Person{Name: "zhang3", Age: 10})
if err != nil {
log.Fatalln(err)
}
fmt.Println(ret.InsertedID)
rets, err := col.InsertMany(context.TODO(), []interface{}{
&Person{Name: "li4", Age: 20},
&Person{Name: "wang5", Age: 21},
})
if err != nil {
log.Fatalln(err)
}
fmt.Println(rets.InsertedIDs)
}
func FindOne() {
fmt.Println("FindOne:")
col := client.Database("my_db").Collection("my_col")
var p Person
//查询单条记录
err := col.FindOne(context.TODO(), bson.D{{"name", "zhang3"}}).Decode(&p)
if err != nil {
log.Fatalln(err)
}
fmt.Println(p)
}
func Find() {
fmt.Println("Find:")
opt := options.Find()
opt.SetLimit(5)
col := client.Database("my_db").Collection("my_col")
//Find查询多条记录,将会返回一个迭代器,使用完记得关闭
cor, err := col.Find(context.TODO(), bson.D{{"name", "zhang3"}}, opt)
if err != nil {
log.Fatalln(err)
}
defer cor.Close(context.TODO())
for cor.Next(context.TODO()) {
var p Person
cor.Decode(&p)
fmt.Println(p)
}
}
func updateOne() {
//条件
filter := bson.D{{"name", "zhang3"}}
//如果匹配不存在,则插入
opts := options.Update().SetUpsert(true)
//执行的动作
update := bson.D{
{"$set", bson.D{
{"age", 22}},
},
}
col := client.Database("my_db").Collection("my_col")
ret, err := col.UpdateOne(context.TODO(), filter, update, opts)
if err != nil {
log.Fatalln(err)
}
if ret.MatchedCount != 0 {
fmt.Println("matched", ret.MatchedCount)
}
if ret.UpsertedCount != 0 {
fmt.Println("insert", ret.UpsertedCount)
}
}
func update() {
//条件
filter := bson.D{{"name", "zhang3"}}
//如果匹配不存在,则插入
opts := options.Update().SetUpsert(true)
//执行的动作
update := bson.D{
{"$set", bson.D{
{"age", 22}},
},
}
col := client.Database("my_db").Collection("my_col")
ret, err := col.UpdateMany(context.TODO(), filter, update, opts)
if err != nil {
log.Fatalln(err)
}
if ret.MatchedCount != 0 {
fmt.Println("matched", ret.MatchedCount)
}
if ret.UpsertedCount != 0 {
fmt.Println("insert", ret.UpsertedCount)
}
}
func remove() {
filter := bson.D{{"name", "zhang3"}}
col := client.Database("my_db").Collection("my_col")
ret, err := col.DeleteMany(context.TODO(), filter)
if err != nil {
log.Fatalln(err)
}
fmt.Printf("remove %d records\n", ret.DeletedCount)
}
func main() {
insert()
FindOne()
Find()
updateOne()
update()
remove()
}
运行结果: