MongoDB 在 Ubuntu 上的“存储过程”实现与使用
概念澄清
- Ubuntu 是操作系统,MongoDB 的“存储过程”与操作系统无关,指的是在 MongoDB 服务器端保存并调用的 JavaScript 函数。
- 传统关系型数据库的“存储过程”在 MongoDB 中通常用 服务端 JS 函数 或 聚合管道 来实现;MongoDB 也支持通过 Map-Reduce 进行复杂批处理。
历史方式与现状
- 旧方式(已不推荐):将函数存入 system.js 集合,并用 db.eval() 远程执行。官方已标注 db.eval() 为 deprecated,不建议在生产环境使用。示例:
- 保存:db.system.js.save({_id:“add”, value:function(a,b){ return a+b; }})
- 调用:db.eval(“add(9,3)”) // 已弃用
- 推荐方式:在 MongoDB Shell 中定义函数或使用 聚合管道/Map-Reduce 完成任务;如需在驱动/应用中复用,可将 JS 函数体作为字符串随应用逻辑执行,而非依赖 system.js 与 db.eval。
推荐做法一 服务端函数与调用
- 适用场景:需要在服务器端封装可复用的逻辑(如批量更新、统计等),但不依赖 db.eval。
- 步骤与示例:
- 连接到 MongoDB(Ubuntu 上通常使用 mongosh):mongosh
- 定义函数(在会话中定义,仅当前会话有效;如需持久化,可放入应用代码或系统库并由应用加载执行):
- function sumAB(a, b) { return a + b; }
- function bulkSetStatus(collectionName, ids, status) {
return db[collectionName].updateMany(
{ _id: { $in: ids } },
{ $set: { status: status, updatedAt: new Date() } }
);
}
- 调用:
- sumAB(9, 3)
- bulkSetStatus(“orders”, [ObjectId(“…”), ObjectId(“…”)], “processed”)
- 说明:这种方式不使用 system.js 与 db.eval,符合当前最佳实践;若确需“持久化脚本”,建议放在应用或版本化脚本库中,由应用按需加载执行。
推荐做法二 聚合管道与 Map-Reduce
- 聚合管道(Aggregation Pipeline):适合数据转换、分组统计、过滤排序等,性能与可维护性更好,推荐优先使用。
- 示例:按状态分组统计订单数
- db.orders.aggregate([
{ $group: { _id: “$status”, count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])
- Map-Reduce:适合大规模离线批处理或复杂聚合(MongoDB 4.4+ 仍支持,但聚合管道通常是更优选择)。
- 示例:统计每个用户的订单总数
- db.orders.mapReduce(
function() { emit(this.userId, 1); },
function(key, values) { return Array.sum(values); },
{ out: “user_order_counts” }
)
- 说明:聚合管道语法更直观、可组合性强;Map-Reduce 更灵活但编写与调优成本更高。
在 Ubuntu 上的快速操作清单
- 安装与启动(以 MongoDB 6.0 为例,其他版本替换版本号):
- sudo apt update
- sudo apt install -y mongodb-org
- sudo systemctl start mongod
- sudo systemctl enable mongod
- sudo systemctl status mongod
- 连接与验证:
- mongosh
- 在 mongosh 中执行前述函数或聚合示例
- 安全建议(生产环境):
- 编辑 /etc/mongod.conf,启用认证:
- 重启服务:sudo systemctl restart mongod
- 创建管理员并验证登录(示例创建管理员用户):
- use admin
- db.createUser({ user: “admin”, pwd: “StrongPass!”, roles: [{ role: “userAdminAnyDatabase”, db: “admin” }] })
- 登录验证:mongosh -u admin -p --authenticationDatabase admin