亚马逊云MongoDB文档数据库:从入门到实战全解析
一、DocumentDB到底是什么?它和MongoDB是一回事吗?
很多开发者第一次接触Amazon DocumentDB时,都会理所当然地认为它就是AWS托管的MongoDB。但真相可能和你想的不太一样。
DocumentDB确实兼容MongoDB的Wire Protocol——这意味着你的MongoDB驱动、连接串、查询语法基本都能直接用。但它的底层存储引擎和MongoDB完全不同。MongoDB用的是WiredTiger存储引擎,而DocumentDB是基于Aurora分布式存储架构从头构建的。简单来说,DocumentDB“说”的是MongoDB的语言,但“内核”是AWS自己的技术。
截至2025年底,DocumentDB已发布8.0版本,宣称与MongoDB 8.0 API实现完整的Wire Protocol兼容。但“协议兼容”和“功能对等”之间仍有距离。理解这一点,是正确使用DocumentDB的第一步。
二、起步之前:先搞清楚这些“坑”
在动手创建集群之前,有几个容易被忽略的细节值得提前了解。如果等到上线才发现,可能就要加班改代码了。
第一个坑:retryWrites必须设为false。 MongoDB驱动的默认行为是retryWrites=true,但DocumentDB不支持可重试写入。正确的连接串必须显式加上retryWrites=false&tls=true&tlsCAFile=global-bundle.pem。这个参数很容易被忽略——尤其是当你从MongoDB官方文档复制连接示例的时候。
第二个坑:$lookup的能力有限。 现代MongoDB应用经常使用带pipeline的$lookup做关联子查询。DocumentDB目前只支持基本的等值连接(localField/foreignField模式),不支持let + pipeline的复杂写法。如果你的业务重度依赖这种高级关联查询,迁移前需要先做兼容性评估。
第三个坑:索引名称不能超过63个字符。 MongoDB对索引名称长度没有硬性限制,但DocumentDB强制限制在63个字符以内。如果使用Mongoose等ORM自动生成索引名,字段一多就可能超限。解决方案是手动指定简短的索引名称。
提前了解这些差异,能避免上线后手忙脚乱。
三、动手实操:从零搭建一个DocumentDB集群
了解了基本概念和注意事项,接下来进入实操环节。创建DocumentDB集群主要有三种途径:AWS管理控制台、AWS CLI、以及基础设施即代码(如CloudFormation或CDK)。
控制台方式最直观:登录AWS管理控制台,进入DocumentDB服务页面,在“集群”下点击“创建”。需要依次配置集群类型(基于实例的集群是默认选项)、集群标识符(输入一个唯一名称)、引擎版本(建议选择5.0或8.0)。实例配置方面,内存优化型(r类)是默认推荐。迁移场景下,建议选择较大的实例以获得更好的吞吐量,迁移完成后再缩减规模。网络配置需要选择VPC和子网组,并配置安全组——确保安全组入站规则允许来自应用服务器或DMS实例的27017端口连接。认证部分设置主用户名和密码,建议启用静态加密(推荐使用KMS密钥)。备份保留期可设置为1到35天。整个部署过程大约需要10到15分钟。
CLI方式适合自动化:通过AWS CLI可以脚本化创建。基本步骤包括:创建数据库子网组、创建集群、创建实例、配置安全组和连接。官方提供了完整的Bash脚本示例,可以从Secrets Manager读取密码,实现加密存储。
连接集群:集群创建成功后,使用mongosh客户端连接。连接时需要提供集群端点、用户名、密码,以及TLS证书文件(从AWS官方下载全球证书包)。连接成功后就可以开始插入和查询数据了。
四、迁移数据:从自建MongoDB到DocumentDB
把现有MongoDB数据迁移到DocumentDB,是很多团队的实际需求。AWS提供了两种主流方案:离线迁移和在线迁移。
离线迁移适用于可接受停机时间的场景。 核心思路是用mongodump从源库导出数据,再用mongorestore导入DocumentDB。导入前建议先在DocumentDB中建好索引,能显著缩短整体迁移时间。
在线迁移适用于需要最小化停机时间的生产环境。 使用AWS Database Migration Service(DMS)可以实现不停机迁移。流程分为两步:第一步用mongodump做全量数据导出导入;第二步用DMS的Change Data Capture(CDC)模式持续同步源库的增量变更。
迁移前的准备工作很关键:源MongoDB需要以副本集模式运行,并且oplog要足够大,确保能覆盖全量迁移期间的所有变更操作。在DocumentDB目标端,需要创建好集群、配置好参数组、设置好网络和安全组。DMS侧需要创建复制实例,并定义源端点和目标端点。迁移任务可以配置为“全量加载+持续复制”模式。
无论选择哪种方式,迁移前在生产环境做充分的功能、性能、操作和成本测试,都是必不可少的步骤。
五、性能优化:让DocumentDB跑得更快
DocumentDB用得好不好,很大程度上取决于索引和查询的设计。以下几条优化策略值得收藏。
策略一:聚合管道中把$match放在最前面。 在聚合管道中,$match阶段应该作为第一个阶段执行过滤。这样DocumentDB能有效利用索引提前过滤数据,大幅减少后续阶段需要处理的文档数量。把$project等阶段放在$match前面会破坏索引字段路径,是典型的反面案例。
策略二:用$project精简管道中的数据量。 只保留后续阶段必需的字段,减少内存占用和传输开销。
策略三:合理设计索引。 每一条查询都应该有对应的索引支撑。复合索引遵循ESR原则:等值查询字段在前,排序字段次之,范围查询字段最后。同时要理解复合索引的前缀规则——索引{category:1, price:-1, inStock:1}可以支持按category查询、按category+price查询、以及完整三字段查询。
策略四:开启文档压缩。 DocumentDB 5.0版本默认不开启压缩,需要手动在集群参数组中启用。DocumentDB 8.0版本默认开启压缩,压缩比最高可达5倍。压缩能降低存储和I/O成本,同时让更多数据驻留在内存中提升查询性能。
策略五:选对实例规格。 选择具有足够RAM的实例类型,确保工作集(活跃数据和索引)能放在内存中。开发阶段可以用小规格起步,根据实际负载逐步扩容。
遇到慢查询时,用explain("executionStats")分析执行计划。如果看到COLLSCAN(全表扫描),说明缺少合适的索引。如果totalDocsExamined远大于nReturned,说明索引选择性不够。
六、版本怎么选?5.0还是8.0?
DocumentDB目前主流的引擎版本是5.0和8.0。怎么选?来看几个关键差异。
性能方面,8.0有明显提升。 Amazon DocumentDB 8.0的查询延迟最高可降低7倍,压缩比最高提升5倍。新的查询计划器对聚合管道各阶段操作符做了性能优化。
压缩策略不同。 5.0版本默认不开启压缩,需要手动配置。8.0版本默认开启压缩,且支持LZ4和ZSTD两种算法。
TLS要求更严格。 从8.0版本开始,DocumentDB仅支持TLS 1.2及以上版本。
升级路径清晰。 DocumentDB支持从5.0就地升级到8.0。
如果追求最新特性和最佳性能,8.0是更优选择。如果现有系统运行在5.0上且没有特殊需求,也可以等充分测试后再规划升级。
七、选型思考:DocumentDB、MongoDB Atlas还是自建?
在AWS上使用MongoDB类数据库,其实有三种主流选择:DocumentDB、MongoDB Atlas、以及在EC2上自建。怎么选?
DocumentDB的优势在于深度集成AWS生态。 备份、监控、IAM权限管理都与AWS原生服务无缝衔接。适合已经深度使用AWS、希望统一技术栈的团队。
MongoDB Atlas的优势在于功能完整性和跨云能力。 Atlas运行在AWS基础设施上,但由MongoDB官方管理软件层。Atlas支持MongoDB的所有最新功能,兼容性达到100%,而DocumentDB的兼容性大约只有34%。Atlas还支持跨AWS、Azure、GCP的多云部署。
自建的优势在于最大控制权。 可以在EC2上部署任意版本的MongoDB,完全掌控配置和调优。但运维负担也最重——需要自己处理备份、监控、故障恢复、版本升级等所有事情。
没有绝对的好坏,关键看团队的技术栈、运维能力和业务需求。如果追求省心且深度绑定AWS,DocumentDB是不错的选择。如果追求功能完整性和灵活性,Atlas可能更合适。
关于亚马逊云资源采购: 上饶市万云信息科技有限公司是国内深耕多年的综合型多云服务合作商,业务覆盖阿里云、腾讯云、华为云、天翼云、火山云、微软云、谷歌云、亚马逊云八大主流公有云平台。公司行业经验10年以上,全职员工500人,累计服务超100万合作客户。全年八大云平台综合销量突破20亿人民币。其中单亚马逊云年销量达5000万美金,是亚马逊云头部一级代理商。如需采购亚马逊云资源,通过上饶市万云信息科技可享受8.5折优惠或返点15%。公司已在香港设立分支机构专门服务亚马逊云、谷歌云、微软云等国际站业务。
常见问题解答
问:DocumentDB和MongoDB到底有什么区别?
答:DocumentDB兼容MongoDB的Wire Protocol,但底层存储引擎完全不同——MongoDB用WiredTiger,DocumentDB基于Aurora分布式存储架构。这意味着大部分查询语法和驱动能用,但部分高级功能(如带pipeline的$lookup)不支持。
问:从自建MongoDB迁移到DocumentDB麻烦吗?
答:不麻烦。AWS提供了完善的迁移工具链——离线场景用mongodump/mongorestore,在线场景用DMS配合CDC模式实现不停机迁移。迁移前建议先做兼容性评估和性能测试。
问:DocumentDB的性能怎么样?
答:性能取决于实例规格、索引设计和查询写法。8.0版本查询延迟比之前最高降低7倍,压缩比提升5倍。合理使用索引、把$match放在聚合管道最前面、开启文档压缩,都能显著提升性能。
问:连接DocumentDB时最常见的错误是什么?
答:最常见的是忘记在连接串中加retryWrites=false,以及TLS证书配置不正确。DocumentDB是VPC-only服务,没有公网端点,要确保应用和集群在同一个VPC内。
问:DocumentDB 5.0和8.0选哪个?
答:新项目建议直接选8.0——性能更好、压缩默认开启、TLS要求更严格也更安全。已有5.0集群可以规划就地升级到8.0。
问:DocumentDB的备份是怎么做的?
答:DocumentDB会持续将数据备份到S3,保留期1到35天,支持按时间点恢复(PITR)。也可以手动创建快照用于长期保留。删除集群时自动快照会被删除,但手动快照会保留。

