我目前正在使用带有MGO lib的MongoDB用于Web应用程序,但我不确定我使用它的方式是否合适.

package db

import (
    "gopkg.in/mgo.v2"
)

const (
    MongoServerAddr = "192.168.0.104"
    RedisServerAddr = "192.168.0.104"
)

var (
    MongoSession, err = mgo.Dial(MongoServerAddr)

    MDB  = MongoSession.DB("message")
    MCol = MDB.C("new")
    MSav = MDB.C("save")

    UDB  = MongoSession.DB("account")
    UCol = UDB.C("user")
)

我初始化db会话并创建变量,这些变量接受集合和文档值,

就像这样:

func UserExist(username string) bool {
    user := Users{}
    err := db.UCol.Find(bson.M{"username": username}).One(&user)
    if err != nil {
        return false
    } else {
        return true
    }
}

那么有没有最好的做法,或者这个很好..? 谢谢

推荐答案

我建议不要使用那样的全球会议.相反,您可以创建一个负责所有数据库交互的类型.例如:

type DataStore struct {
    session *mgo.Session
}

func (ds *DataStore) ucol() *mgo.Collection { ... }

func (ds *DataStore) UserExist(user string) bool { ... }

这种设计有很多好处.重要的一点是,它允许您同时运行多个会话,因此如果您有一个http处理程序,例如,您可以为该请求创建一个由独立会话支持的本地会话:

func (s *WebSite) dataStore() *DataStore {
    return &DataStore{s.session.Copy()}
}    

func (s *WebSite) HandleRequest(...) {
    ds := s.dataStore()
    defer ds.Close()
    ...
}

在这种情况下,mgo驱动程序表现良好,因为会话是在内部缓存和重用/维护的.在使用过程中,每个会话还将由一个独立的套接字支持,可以配置独立的设置,也可以进行独立的错误处理.如果使用单个全局会话,这些问题最终将不得不解决.

Database相关问答推荐

Metasploit 数据库警告

安装postgresql用于使用和调试Apache-AGE

有关托管默认 SQL Server 实例的 Azure VM 数据库服务器的问题

如何让 Google Drive Electron 表格像 MySQL 数据库一样工作吗?

在 MySQL 中创建表时如何定义列的默认值?

使用 2 个进程处理数据库

什么是 Scalar标量查询?

Neo4j:逐步创建自动索引

获取错误函数 to_date(timestamp without time zone, unknown) 不存在

限制一个 sqlite 表的最大行数

如何在 Postgres 9.6+ 中生成长度为 N 的随机、唯一的字母数字 ID?

我是否需要为关系数据库表的主键创建单独的索引

MongoDB 和 PostgreSQL 的思考

Sqlite 判断表是否为空

如何在文件系统中存储图像

XML、CSV 或数据库格式的 ICD-9 代码列表

数据库效率 - 每个用户的表与用户表

为什么 Rails 迁移在应用程序中定义外键而不在数据库中定义外键?

在 UI 中执行业务逻辑的单元测试数据库应用程序

如何在 Java 中检测 SQL 表的存在?