后端项目使用建议

MongoDB 接入后端项目时,不要只关注“能连上”。

还要考虑结构、索引、连接池、超时、错误处理和安全。

一、连接字符串不要写死

不推荐:

uri := "mongodb://blog_app:password@127.0.0.1:27017/mongodb_tutorial"

推荐放到环境变量:

MONGODB_URI=mongodb://blog_app:strong_password@127.0.0.1:27017/mongodb_tutorial?authSource=mongodb_tutorial

后端启动时读取环境变量。

二、一个应用复用客户端

不要每次请求都重新创建数据库连接。

正确思路:

应用启动时创建 MongoDB client
接口请求复用这个 client
应用关闭时断开连接

频繁创建连接会浪费资源,也会拖慢接口。

三、给数据库操作设置超时

后端访问数据库时要设置超时。

伪代码:

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 使用 ctx 执行数据库操作

这样数据库慢查询或网络异常时,不会让请求无限卡住。

四、请求结构体和数据库文档结构分开

不要把前端请求直接原样写进数据库。

例如创建用户请求:

{
  "username": "zhangsan",
  "password": "123456"
}

数据库里不应该保存明文密码。

应该保存:

{
  username: "zhangsan",
  passwordHash: "...",
  createdAt: new Date()
}

请求结构、业务结构、数据库结构要分清楚。

五、索引跟着接口走

先看接口怎么查,再设计索引。

例如登录接口按邮箱查用户:

db.users.findOne({
  email: "zhangsan@example.com"
})

应该建唯一索引:

db.users.createIndex(
  { email: 1 },
  { unique: true }
)

文章列表按状态和时间查询:

db.posts.find({
  status: "published"
}).sort({
  createdAt: -1
})

可以考虑:

db.posts.createIndex({
  status: 1,
  createdAt: -1
})

六、不要直接返回数据库错误

不推荐:

{
  "message": "E11000 duplicate key error collection..."
}

推荐转成业务提示:

{
  "code": 400,
  "message": "邮箱已被使用"
}

数据库错误细节应该写日志,不应该直接暴露给前端用户。

七、适合新手的目录思路

project/
├── internal/
│   ├── handler/       # HTTP 接口层
│   ├── service/       # 业务逻辑层
│   ├── repository/    # MongoDB 读写封装
│   └── model/         # 数据模型
├── config/            # 配置读取
├── pkg/
│   └── database/      # MongoDB client 初始化
├── go.mod
└── main.go

核心思想:

  • handler 不直接拼复杂 MongoDB 查询。
  • service 处理业务规则。
  • repository 负责数据库读写。
  • model 定义数据库文档结构。

八、上线前检查清单

  • 是否开启认证。
  • 是否使用业务专用用户。
  • 是否配置必要索引。
  • 是否设置连接超时和请求超时。
  • 是否避免返回数据库内部错误。
  • 是否有备份和恢复方案。
  • 是否限制数据库网络访问来源。

MongoDB 很灵活,但真实项目里要靠清晰的建模、索引和工程规范来保证可维护性。