【问题标题】:Create a function which returns a mongo collection with Golang and MGO使用 Golang 和 MGO 创建一个返回 mongo 集合的函数
【发布时间】:2015-10-21 04:22:50
【问题描述】:

我是 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()

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

【问题讨论】:

    标签: mongodb go mgo


    【解决方案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)
    }
    

    【讨论】:

    • 这不是最好的主意。会话大致转换为连接。因此,传递它很可能会导致人为的瓶颈。
    【解决方案2】:

    您所描述的是工厂模式。但是有一些注意事项需要处理。 Defer 对于它被调用的范围是本地的。因此,如果您将 defer 放入工厂方法中,则会话在返回时基本上会关闭。

    仅定义一个会话并在所有地方重用它与使用单个 SQL 数据库连接而不是池几乎相同 - 它的扩展性非常可怕。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 2016-07-20
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多