我正在将Go后端从使用mgo迁移到mongo-go.该服务有很多代码,我已经完成了大部分,除了处理旧mgo中的session.Copy()方法的部分.相关片段如下:

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.Copy中所解释的. 有几种我似乎可以使用的方法,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的会议是两个不同的实体.

mgo's session:

Session表示与数据库的通信会话.

mongo-go's session:

Session是一个表示MongoDB逻辑会话的接口.会话可用于实现一组操作的因果一致性或在ACID事务中执行操作.

MGO的会话是一个通信会话,使用单个底层连接.Mongo-Go的会话是一个逻辑会话,不能取代MGO的会话.

MGO会话的主要用途是利用多个底层连接.Mongo-Go管理一个内部池,您无需创建新会话即可使用多个连接.这是在Mongo-Go中自动和内部处理的.你不需要添加任何东西来"替换"MGO的session.Copy(),省略这一行.

请参阅相关问题:

Concurrency in gopkg.in/mgo.v2 (Mongo, Go)

MongoDB transactions, the callback API approach

Mongodb相关问答推荐

MongoDB:删除键上有条件的对象元素

MongoDB - 将数组元素转换为新字段

MongoDB 在一个聚合中包含多个组

使用 multer 在我的 MERN 前端显示 MongoDB 图像的正确语法是什么?

MongoDB 按 created_at 月聚合

如何为具有相同名称的嵌套字段创建文本索引

Mongoose 更新不同类型的记录

使用 mgo 从 golang 中的 Mongodb 中 Select 列

如何在 Mongo 聚合管道中获取限制之前的计数

在 mongoDB 中存储 java 8 LocalDate

如何使用 C# MongoDB 驱动程序检索字段子集?

Mongo 重启错误 -- /var/run/mongodb/mongod.pid 存在

用 Redis 查询?

MongoDB 聚合 $divide 计算字段

Mongoose 与 mongodb 如何返回刚刚保存的对象?

Node.js MongoDB Upsert 更新

try 解析序列化 JSON 字符串时处理 MongoDB 的 ISODate()

如何确保基于特定字段的数组中的唯一项 - mongoDB?

我如何使用 Twitter 的流 api 中的推文并将它们存储在 mongodb 中

MongoError:Can't extract geo keys from object