Skip to main content
[ PIER ]

MongoDB

面向灵活演进式模式的文档数据库。

Database 支持集群 #nosql#document

MongoDB 是面向文档的 NoSQL 数据库,将数据存储为 BSON(二进制 JSON)。它是模式快速演进、深度嵌套数据和高写入量应用的默认选择 — 在那些刚性 SQL DDL 会拖慢开发的场景。

使用 Pier 部署

  1. 1 打开 Pier 控制台,点击 Add service。
  2. 2 从模板列表中选择 MongoDB。
  3. 3 选择版本、设置服务名称,Pier 会自动配置容器、存储和端口。
  4. 4 如需 HTTPS,请绑定域名。Traefik 会自动签发 Let's Encrypt 证书。

什么是 MongoDB?

MongoDB 是部署最广的 NoSQL 文档数据库。它将 BSON 文档(很像嵌套对象的 JSON) 分组到集合中,而不是表和行。模式是可选的;查询使用丰富的类 JSON 语法, 自然映射到 JavaScript 和其他动态语言。

与 SQL 的权衡是真实的:你放弃了跨集合外键完整性和 SQL 标准 ANSI 合规。 作为交换,你获得读时模式的灵活性、深度文档原子性,以及比刚性关系行更 适合现代应用数据形状的查询语言。

Pier 如何部署它

Pier 使用官方 mongo Docker 镜像,将 /data/db 挂载为持久卷。默认版本为 latest(MongoDB 8.x);7 和 6 可用于严格版本固定。Root 凭据通过 MONGO_INITDB_ROOT_USERNAME + MONGO_INITDB_ROOT_PASSWORD 自动生成。

此模板仅单节点 — 多节点副本集需要手动初始化,目前不通过 Pier 的集群模式 支持。备份使用 mongodump --archive --gzip 按计划运行,可推送到 S3。

何时不要使用 MongoDB

对于具有严格关系完整性需求的工作负载(财务总账、严格外键的库存)— 选 Postgres。对于全文搜索 — Elasticsearch。对于嵌入式单进程 — SQLite。当 你的数据具有经常变形的嵌套结构且你想要 JSON 原生人体工程学时,Mongo 大放异彩。

核心功能

模式灵活性

集合中的每个文档可以有自己的形状。添加字段无需 ALTER TABLE;删除字段无需迁移。需要时可以强制执行验证规则。

强大的聚合管道

$match、$group、$lookup(连接)、$facet、$bucket、$unwind、$graphLookup — MongoDB 的聚合框架在文档数据上的分析查询能力可与 SQL 媲美。

原生水平扩展

通过哈希或范围键分片将集合拆分到多个节点。副本集提供自动故障切换、读取扩展和零停机维护。

地理空间索引

用于 GeoJSON 点、多边形、多重多边形的 2dsphere 索引。$near、$geoWithin、$geoIntersects 查询,公里级精度。

变更流(CDC)

通过变更流实时订阅插入/更新/删除。构建响应式 UI、同步到其他系统、驱动事件驱动工作流。

时间序列集合(5.0+)

专用的时间序列集合,具有列式存储和自动分桶 — 为 IoT 和指标工作负载量身定制。

应用场景

用户生成内容平台

社交媒体帖子、评论、反应 — 每个文档的灵活字段自然契合 BSON。

实时 IoT 数据摄取

高写入吞吐量、时间序列集合和变更流使 Mongo 成为可行的专用 IoT 后端。

具有可变属性的产品目录

不同类别具有不同属性的电商目录(电视有屏幕尺寸;书籍有 ISBN)— 无需稀疏 SQL 列或 EAV。

移动应用同步后端

Mongo Realm + Atlas Device Sync。自托管时,搭配 WatermelonDB 或 PouchDB 风格的同步层。

单一视图 / 360 度客户档案

将许多系统的数据聚合为每个客户一个去规范化的文档。对嵌套字段的原子更新。

代码示例

插入文档 javascript
db.users.insertOne({
  email: "[email protected]",
  profile: {
    name: "Aleksandr",
    locale: "zh",
    tags: ["beta", "pro"]
  },
  createdAt: new Date()
});
聚合管道(按区域的热门标签) javascript
db.users.aggregate([
  { $unwind: "$profile.tags" },
  { $group: {
      _id: { locale: "$profile.locale", tag: "$profile.tags" },
      count: { $sum: 1 }
  }},
  { $sort: { count: -1 } },
  { $limit: 20 }
]);
地理空间查询(查找 5 公里内) javascript
db.places.createIndex({ location: "2dsphere" });

db.places.find({
  location: {
    $near: {
      $geometry: { type: "Point", coordinates: [37.6173, 55.7558] },
      $maxDistance: 5000
    }
  }
});
变更流(实时 CDC) javascript
const stream = db.orders.watch([
  { $match: { "fullDocument.status": "paid" } }
]);
stream.on("change", (ev) => sendToWarehouse(ev.fullDocument));

对比

vs 带 JSONB 的 PostgreSQL Postgres 的 JSONB 在保留连接、事务和 SQL 的同时匹配 Mongo 的灵活性。如果需要在一个地方同时处理关系数据和文档,Postgres 通常胜出。当文档是主要模型且需要原生变更流 + 分片时选 Mongo。
vs CouchDB CouchDB 是支持离线优先同步的主-主架构 — 适合移动端。Mongo 在聚合能力、生态和工具上胜出。
vs Elasticsearch Elastic 专为全文搜索而生;Mongo 用于通用文档存储。它们经常配合 — Mongo 作为真相源,Elastic 作为搜索索引。
vs DynamoDB Dynamo 是 AWS 托管且按请求付费;Mongo 是自托管且成本可预测。Mongo 具有 Dynamo 缺少的聚合能力。

常见问题

Pier 部署哪个 MongoDB 版本?
默认 `latest`(当前 8.x)。版本 7 和 6 也在选择器中。MongoDB 5.0+ 是时间序列集合所必需。
支持复制吗?
默认单节点。副本集需要 3+ 节点和特殊初始化脚本 — 通过标准模板不支持。对于副本集,使用自定义 Docker 模板或 Mongo Atlas。
SSPL 许可证影响我吗?
SSPL 仅限制向第三方提供 MongoDB 作为 SaaS。将其用作自己应用程序(即使是商业的)的数据库是可以的。Pier 直接部署官方 `mongo` 镜像。
如何从我的应用连接?
标准 URI — `mongodb://user:pass@host:27017/dbname`。Pier 在服务详情页上显示完整字符串。
默认认证?
Pier 在初始化时设置 `MONGO_INITDB_ROOT_USERNAME` 和 `MONGO_INITDB_ROOT_PASSWORD`(自动生成的强密码)。
备份是自动的吗?
是 — `mongodump --archive --gzip` 按计划运行并可推送到 S3。按数据库和完整实例备份都受支持。
何时添加索引?
当查询耗时超过 100ms 时立即添加。使用 `db.collection.explain('executionStats').find(...)` 检查计划。生产 Mongo 问题大多是 $sort 或 $match 字段缺少索引。

相关服务

在你的 VPS 上部署

MongoDB 是面向文档的 NoSQL 数据库,将数据存储为 BSON(二进制 JSON)。它是模式快速演进、深度嵌套数据和高写入量应用的默认选择 — 在那些刚性 SQL DDL 会拖慢开发的场景。

部署此服务 →