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
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用 Go 语言操作 MongoDB 数据库时,可以使用事务来管理写入、删除等操作。 首先,在开启事务之前,需要先获取一个 MongoDB 连接: ``` client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017")) if err != nil { // handle error } ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() err = client.Connect(ctx) if err != nil { // handle error } ``` 然后,可以使用 `client.Database()` 方法来获取数据库的句柄,再使用 `Database.StartSession()` 方法来开启一个事务: ``` sess, err := client.Database("mydb").StartSession() if err != nil { // handle error } defer sess.EndSession(ctx) ``` 在事务中执行写入、删除等操作时,需要使用 `Session.WithTransaction()` 方法来包裹这些操作,并使用 `Session.AbortTransaction()` 方法来回滚事务: ``` err = sess.WithTransaction(ctx, func(sessCtx mongo.SessionContext) error { // perform write operations _, err = client.Database("mydb").Collection("mycoll").InsertOne(sessCtx, bson.M{"x": 1}) if err != nil { sess.AbortTransaction(sessCtx) return err } return nil }) if err != nil { // handle error } ``` 在事务中执行的所有操作都会在事务提交之前保存到内存中,并在事务提交时一起写入到数据库中。如果在事务中出现了错误,可以使用 `Session.AbortTransaction()` 方法来回滚事务,所有在事务中执行的操作都不会写入到数据库中。 在事务结 ### 回答2: 在Go语言中操作MongoDB,可以使用事务回滚来进行写入、删除等操作。以下是一些基本操作的示例: 1. 初始化MongoDB客户端和数据库连接: ```go clientOptions := options.Client().ApplyURI("mongodb://localhost:27017") client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Fatal(err) } database := client.Database("mydatabase") ``` 2. 开启事务: ```go session, err := client.StartSession() if err != nil { log.Fatal(err) } defer session.EndSession(context.TODO()) ``` 3. 事务开始后,可以执行多个操作。例如,插入一条数据: ```go session.StartTransaction() collection := database.Collection("mycollection") doc := bson.D{{"key", "value"}} _, err = collection.InsertOne(session.Context(), doc) if err != nil { session.AbortTransaction(session.Context()) log.Fatal(err) } ``` 4. 执行其他操作,比如删除一条数据: ```go collection := database.Collection("mycollection") filter := bson.D{{"key", "value"}} _, err = collection.DeleteOne(session.Context(), filter) if err != nil { session.AbortTransaction(session.Context()) log.Fatal(err) } ``` 5. 若所有操作都成功执行,提交事务: ```go err = session.CommitTransaction(session.Context()) if err != nil { log.Fatal(err) } ``` 6. 若操作发生错误或者需要回滚,可以调用AbortTransaction()进行事务回滚: ```go session.AbortTransaction(session.Context()) ``` 以上是一个简单的示例,用于展示如何在Go语言中使用事务回滚进行写入和删除操作。实际应用中,可能需要更多的代码和逻辑来处理错误以及处理更复杂的事务操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值