Mongo-go 驱动版本的 session.copy()

问题描述 投票:0回答:1

我正在将 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)
    }
mongodb go mgo mongo-go
1个回答
0
投票

mgo 的会话和 mongo-go 的会话是 2 个不同的实体。

mgo 的会议:

Session代表与数据库的通信会话。

mongo-go 的会话:

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

mgo 的会话是一个通信会话,并且使用单个底层连接。 mongo-go 的会话是一个逻辑会话,并不能替代 mgo 的会话。

mgo 会话的主要用途是利用多个底层连接。 mongo-go 管理一个内部池,您不需要创建新会话来使用多个连接。这是在 mongo-go 内部自动处理的。您不需要添加任何内容来“替换” mgo 的

session.Copy()
,省略该行。

查看相关问题:

gopkg.in/mgo.v2 中的并发(Mongo、Go)

MongoDB 事务,回调 API 方法

© www.soinside.com 2019 - 2024. All rights reserved.