2016-12-15 84 views
3

我有一個從mongodb atlas的副本集,我可以使用任何其他語言連接到這個副本集,並使用以下格式提供的URL:使用Golang連接到MongoDB Atlas mgo:持久性無法訪問服務器到副本集

「的mongodb://用戶:[email protected]:27017,prefix2.mongodb.net:27017,prefix3.mongodb.net:27017 /測試& replicaSet = Cluster0-碎片-0 & authSource = admin「

無論我嘗試什麼,添加ssl = true並刪除,沒有任何工作。它始終是「無法訪問的服務器」。

我嘗試了每個組合的url,每個組合的dialConfig,還撥號和DialWithConfig配置。

可能是什麼原因?

+0

對此問題的任何更新? – Marcel

回答

6

使用MongoDB Go Driver以下(mgo)的代碼片段連接到MongoDB Atlas作品,使用示例數據:

import (
    "gopkg.in/mgo.v2" 
    "crypto/tls" 
    "net" 
) 

tlsConfig := &tls.Config{} 

dialInfo := &mgo.DialInfo{ 
    Addrs: []string{"prefix1.mongodb.net:27017", 
        "prefix2.mongodb.net:27017", 
        "prefix3.mongodb.net:27017"}, 
    Database: "authDatabaseName", 
    Username: "user", 
    Password: "pass", 
} 
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { 
    conn, err := tls.Dial("tcp", addr.String(), tlsConfig) 
    return conn, err 
} 
session, err := mgo.DialWithInfo(dialInfo) 

請注意,您也可以只指定副本集成員的種子之一。例如:

Addrs: []string{"prefix2.mongodb.net:27017"} 

參見:

更新

您也可以使用ParseURL()方法來分析MongoDB Atlas URI字符串。但是,目前此方法不支持SSL(mgo.V2 PR:304

解決方法是在解析之前取出ssl=true行。

//URI without ssl=true 
var mongoURI = "mongodb://username:[email protected],prefix2.mongodb.net,prefix3.mongodb.net/dbName?replicaSet=replName&authSource=admin" 

dialInfo, err := mgo.ParseURL(mongoURI) 

//Below part is similar to above. 
tlsConfig := &tls.Config{} 
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { 
    conn, err := tls.Dial("tcp", addr.String(), tlsConfig) 
    return conn, err 
} 
session, _ := mgo.DialWithInfo(dialInfo) 
+0

如果'dialInfo'是通過這種方式生成的,你能告訴連接字符串的外觀嗎? 'dialInfo,err:= mgo.ParseURL(url)'。讚賞。 – Marcel

+1

@Marcel查看更新的答案。 –