我正在将 go 后端从使用
mgo
迁移到 mongo-go
。该服务有很多代码,除了处理旧 session.Copy()
中的 mgo
方法的部分之外,我已经完成了大部分代码。相关片段如下:
import (
"gopkg.in/mgo.v2"
)
...
type Store struct {
session *mgo.Session
}
func (s *Store) collection(collectionName string) (*mgo.Session, *mgo.Collection) {
session := s.session.Copy()
collection := session.DB("").C(collectionName)
return session, collection
}
我想在尊重整体设计的同时重写这个,但我不确定该怎么处理该行
session := s.session.Copy()
- 我想做类似的事情:
import(
"go.mongodb.org/mongo-driver/mongo"
)
type Store struct {
client *mongo.Client
}
func (s *Store) collection(collectionName string) (*mongo.Client, *mongo.Collection) {
client, err := s.client."what method to call here"
if err != nil {
//error will be handled here
}
collection := session.Database(DBName).Collection(collectionName)
return session, collection
}
我的理解是,
session.Copy()
方法尊重已经存在的原始连接,但仅基于此启动一个新会话,如此处所述https://pkg.go.dev/gopkg.in/mgo.v2#Session .复制。
我似乎可以使用多种方法,而 m.client.StartSession(opts ...*options.SessionOptions)
看起来是自然的候选者。但它的文档让我感到困惑,因为连接已经通过类似以下内容在 main.go
中建立:
clientOptions := options.Client().ApplyURI("URI")
// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
mgo 的会话和 mongo-go 的会话是 2 个不同的实体。
Session代表与数据库的通信会话。
Session是代表MongoDB逻辑会话的接口。会话可用于实现一组操作的因果一致性或在 ACID 事务中执行操作。
mgo 的会话是一个通信会话,并且使用单个底层连接。 mongo-go 的会话是一个逻辑会话,并不能替代 mgo 的会话。
mgo 会话的主要用途是利用多个底层连接。 mongo-go 管理一个内部池,您不需要创建新会话来使用多个连接。这是在 mongo-go 内部自动处理的。您不需要添加任何内容来“替换” mgo 的
session.Copy()
,省略该行。
查看相关问题: