【发布时间】:2022-02-06 19:10:58
【问题描述】:
我创建了一个 Cosmos DB,并尝试通过我的 GoLang 应用程序连接到它。代码如下:
type DB struct {
MongoDB *mongo.Client
}
var dbConn = &DB{}
func NewMongoDB(connectionString string) (*mongo.Client, error) {
//Create a context to use with the connection
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
clientOptions := options.Client().ApplyURI(connectionString).SetDirect(true)
client, err := mongo.NewClient(clientOptions)
if err != nil {
log.Fatalf("unable to initialize new Cosmos DB client %v", err)
return nil, err
}
err = client.Connect(ctx)
if err != nil {
log.Fatalf("unable to initialize connection %v", err)
return nil, err
}
err = TestConnection(client, &ctx)
if err != nil {
log.Fatal(err)
return nil, err
}
return client, err
}
func ConnectNoSQL(connectionString string) (*DB, error) {
//Create a new Mongo DB client
db, err := NewMongoDB(connectionString)
if err != nil {
log.Fatal(err)
return nil, err
}
dbConn.MongoDB = db
return dbConn, err
}
func TestConnection(client *mongo.Client, ctx *context.Context) error {
if err := client.Ping(*ctx, nil); err != nil {
fmt.Println("Could not PING database due to - ", err)
return err
}
return nil
}
...
// 2. Connect to database
log.Println("Connecting to database ..") //Create the URI we will use to connect to out cosmosDB
connecturi := fmt.Sprintf(
"mongodb://%s:%s@%s.documents.azure.com:%s/%s?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@%s@",
*dbUser,
*dbPassword,
*dbHost,
*dbPort,
*dbName,
*dbHost)
db, err := driver.ConnectNoSQL(connecturi)
if err != nil {
log.Fatal("Cannot to databse ...")
}
这是错误信息:
2022/02/01 22:48:53 服务器选择错误:超出上下文期限, 当前拓扑:{类型:单,服务器:[{地址: 场景原型 db.documents.azure.com:443,类型:未知,最后 错误:连接握手期间发生连接()错误: 连接({COSMOS-DB-NAME}.documents.azure.com:443[-22])长度 of read message too large: 已读消息长度太大 }, ] }
我不确定发生了什么。我按照微软官方文档中的教程-https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb/create-mongodb-go,但没能做到。
看起来是这样的:
- 通过 mongo.NewClient 创建一个新客户端
- 设法连接到它
- 当我尝试 PING 时,TestConnection 失败。
有什么想法吗?另外,这可能是因为我的 API 设置为 SQL api 而不是 Mongo API(可能是愚蠢的问题,但我想了解错误的含义)
谢谢!
【问题讨论】:
-
您几乎回答了自己的问题:您不能针对使用 SQL API 的 Cosmos DB 实例使用 MongoDB 驱动程序。您必须创建一个 MongoDB API 实例,它适用于所有 MongoDB 驱动程序。
-
同意@DavidMakogon 提到的,过去遇到过这个问题。 CosmosDb 是多个 DB 端点的伞形名称,但您需要单独配置它们并且它们不可互换,(您不能从 sql 切换到 mongo)
标签: azure go azure-cosmosdb azure-cosmosdb-sqlapi azure-cosmosdb-mongoapi