依赖包的选择:
impor "go.mongodb.org/mongo-driver/mongo"
go.mod
中写入
require go.mongodb.org/mongo-driver v1.9.0
// 简单连接
func main() {
clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct")
client, err := mongo.Connect(context.TODO(), clientOpts)
if err != nil {
log.Fatal(err)
}
// context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间
if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil {
fmt.Println("Connected to MongoDB!")
}
}
// shard分片连接
func main() {
clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018")
client, err := mongo.Connect(context.TODO(), clientOpts)
if err != nil {
log.Fatal(err)
}
err = client.Ping(context.TODO(), clientOpts.ReadPreference)
if err == nil {
fmt.Println("Pong")
}
}
// User 如果字段不大写的话mongoDB就没办法插入该字段
type User struct {
Id int64
Name string
Password string
}
insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"})
if err != nil {
log.Fatal(err)
}
fmt.Println("插入一条数据",insert.InsertedID)
// 插入多个文档
users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}}
insertMany, err := collection.InsertMany(context.TODO(), users)
if err != nil {
log.Fatal(err)
}
fmt.Println("插入多条数据",insertMany.InsertedIDs)
// 获取单条信息
var result User
err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("单条查询结果为 %+v\n",result)
// 获取多条信息
findOptions := options.Find()
findOptions.SetLimit(2)
// 获取多条信息并返回一个游标
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
log.Fatal(err)
}
// 通过迭代获取所有信息
for cur.Next(context.TODO()) {
var elem User
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("查询多条数据%+v\n",results)
// 更新一条数据
filter := bson.D{{"name","张三"}}
update := bson.D{{
"$set",bson.D{
{"Password","321"},
},
}}
updateOne, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Println("更新一条数据",updateOne.ModifiedCount)
// 删除所有数据
many, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
log.Fatal(err)
}
fmt.Println("删除所有数据",many.DeletedCount)
// 简单连接
func main() {
clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct")
client, err := mongo.Connect(context.TODO(), clientOpts)
if err != nil {
log.Fatal(err)
}
// context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间
if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil {
fmt.Println("Connected to MongoDB!")
}
// 断开连接
defer func() {
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
}
}()
// 获取一个集合
collection := client.Database("test").Collection("user")
// 删除所有数据
many, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
log.Fatal(err)
}
fmt.Println("删除所有数据",many.DeletedCount)
// 插入一个文档
insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"})
if err != nil {
log.Fatal(err)
}
fmt.Println("插入一条数据",insert.InsertedID)
// 插入多个文档
users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}}
insertMany, err := collection.InsertMany(context.TODO(), users)
if err != nil {
log.Fatal(err)
}
fmt.Println("插入多条数据",insertMany.InsertedIDs)
// 获取单条信息
var result User
err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("单条查询结果为 %+v\n",result)
// 更新一条数据
filter := bson.D{{"name","张三"}}
update := bson.D{{
"$set",bson.D{
{"Password","321"},
},
}}
updateOne, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Println("更新一条数据",updateOne.ModifiedCount)
// 获取多条信息
findOptions := options.Find()
findOptions.SetLimit(2)
var results []User
// 获取多条信息并返回一个游标
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
log.Fatal(err)
}
// 通过迭代获取所有信息
for cur.Next(context.TODO()) {
var elem User
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("查询多条数据%+v\n",results)
}
// User 如果字段不大写的话mongoDB就没办法插入该字段
type User struct {
Id int64
Name string
Password string
}