Go --- 简单操作MongoDB

依赖包的选择:

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
}

你可能感兴趣的:(go学习笔记,go,mongodb)