MongoDB 将数据保存为 BSON 文档,适合围绕业务对象组织嵌套字段与数组。它不要求每条文档完全同构,但灵活结构仍需要字段含义、类型和校验规则,否则查询和维护成本会逐渐上升。
从文档和查询开始
在独立测试库中创建并查询文档:
use demo
db.ent_info.insertOne({ _id: 964, name: "示例企业", shareholders: [{ holderName: "示例股东" }] })
db.ent_info.findOne({ _id: 964 })
db.ent_info.find({ "shareholders.holderName": "示例股东" })
嵌套字段使用点号路径。查询条件的数据类型需要与存储值一致,整数 964 与字符串 “964” 不能随意互换;生产系统还应明确 _id 的类型与生成规则。
建模比“数据很多”更重要
决定嵌入还是引用时,先看读取范围、更新频率与文档增长。一起读取且规模可控的数据适合嵌入;无界增长的数组可能导致大文档和更新开销,需要拆分。
MongoDB 不是“没有事务的数据库”。单文档操作具有原子性,支持多文档事务的版本与部署也能提供相应事务能力,但成本与限制需要评估。2016 年的 3.2 环境不能直接套用后续版本的多文档事务 API。
索引与客户端
按实际过滤和排序模式建立索引,并通过 explain 检查扫描范围。集合变大不会自动使查询高效,副本集也不会自动将同一份数据分摊到所有节点;分片是另一种扩展机制。
Java 驱动的 3.x MongoClient 与后续驱动 API 有变化,连接、认证、超时和关闭方式应使用一致的版本。客户端通常在应用内复用,不要每次请求新建一个连接池。find 返回可迭代查询结果,想取一条时应明确调用 first 等对应方法,并处理查无数据。
本地试验限制监听范围,正式环境明确认证、权限和备份。成功建立连接之后,还需要验证新增、更新、删除、类型差异和异常输入。
参考:MongoDB 建模、事务。