创建一个使用Golang和MGO返回mongo集合的函数

时间:2015-10-20 16:15:24

标签: mongodb go mgo

我是GOLANG的新手 - 我想降低GO API中处理程序的复杂性。我来自Node.js背景!

目前,路由处理程序如下所示:

func getCards(c web.C, w http.ResponseWriter, r *http.Request) {

    session := *MongoConnection().CreateSession()
    defer session.Close()

    collection := session.DB(db).C(cardsCollection)

    result := []Card{}

    err := collection.Find(bson.M{}).All(&result)
    if err != nil {
        panic(err)
    }

    w.Header().Set("Content-Type", "application/json")
    encoder := json.NewEncoder(w)
    encoder.Encode(result)
}

我想做的是返回一个集合供使用,而不必做这个部分:

session := *MongoConnection().CreateSession()
defer session.Close()

collection := session.DB(db).C(cardsCollection)

相反,我想做像

这样的事情
collection := Card.Collection()

让它创建会话等,这可能吗?

2 个答案:

答案 0 :(得分:1)

为什么不在main函数中创建会话,并将其传递给需要它的包。这显然缺少大量的东西,但总的想法是

package main
//imports
func main() {
    session := *MongoConnection().CreateSession()
    defer session.Close()
    Card.SetSession(session)
    //other stuff
    log.Fatal(http.ListenAndServe(":80", nil))
}

然后在卡

package Card

var session *mgo.Session

func SetSession(s *mgo.Session) {
    session = s
}

func (c *Card) Collection() *mgo.Collection {
    return session.DB(db).C(cardsCollection)
}

答案 1 :(得分:0)

您所描述的是工厂模式。但有一些警告要处理。 延迟是调用范围的本地。因此,如果您将延迟放入工厂方法,会话将在返回时基本关闭。

简单地定义一个会话并在整个地方重复使用它几乎与使用单个SQL数据库连接而不是池一样 - 它可扩展性很差。

这是我倾向于做的事情:我将我的集合作为全局集合,并在我的方法开头执行以下操作

// Create a func-local session
myCollection := globalCollection.With( globalCollection.Database.Session.Copy() )
// Close it on exiting the scope
defer myCollection.Database.Session.Close()

当然,您可以将第一行外部化为工厂,但这不会真正整理代码或使其更具可读性。