动态集合操作必须配合显式错误处理、存在性校验和连接生命周期管理,不能裸调用;创建前需用listCollections校验存在性,删除前应检查文档数并控制权限,命名须白名单过滤防注入。

db.createCollection 和 db.dropCollection 是动态管理集合最直接的手段,但实际用起来容易踩坑——比如异步时机错乱、权限不足报错、或误删非空集合导致数据丢失。核心结论是:**动态集合操作必须配合显式错误处理、存在性校验和连接生命周期管理,不能裸调用**。
如何安全创建新集合(createCollection)
Node.js 中创建集合不是“有就用、没有就建”的自动行为,createCollection 默认不检查集合是否已存在,重复调用会抛出 NamespaceExists 错误。
- 必须先用
db.listCollections({name: 'targetName'})查是否存在,再决定是否创建 -
createCollection的options参数影响后续写入行为:例如{capped: true, size: 1048576}创建固定大小集合,之后无法insert超过容量的文档 - 在集群环境下,
createCollection可能因分片策略失败,需确保目标数据库已启用分片或使用sh.enableSharding('dbname') - 示例片段:
db.listCollections({name: 'logs_202607'}).toArray((err, colls) => { if (err) throw err; if (colls.length === 0) { db.createCollection('logs_202607', {timeseries: {timeField: 'ts'}}, cb); } });
删除集合前必须确认状态(dropCollection)
dropCollection 不会提示“集合不存在”,而是直接回调成功(result 为 false),容易让人误以为删除成功;更危险的是,它不校验集合是否为空,删掉就没了。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 删除前建议先用
collection.countDocuments({})检查文档数,避免误删生产数据 -
dropCollection是原子操作,但不支持事务回滚,线上环境务必加开关控制(如配置项ENABLE_DYNAMIC_DROP: false) - 若用
collection.drop()(通过db.collection(name)获取对象后调用),注意该方法返回Promise,而老版本回调风格的dropCollection是 callback-first,混用会导致undefined错误 - 权限问题常见于 MongoDB Atlas 或企业版:用户需具备
dropCollectionaction 权限,仅readWrite不够
遍历所有集合时别依赖 collectionNames
collectionNames 已被弃用(MongoDB Node.js 驱动 v4+),返回结果包含系统集合(如 system.indexes),且字段结构不稳定;listCollections 才是标准方式。
- 用
db.listCollections().toArray()获取干净的集合名列表,过滤掉^system\.开头的项 - 若需判断集合类型(普通 / timeseries / capped),应读取每个集合的
options字段,而非仅靠名称猜测 - 注意
listCollections不保证顺序,不要假设返回数组和show collectionsshell 命令一致 - 在高并发场景下,两次
listCollections之间可能有集合被创建或删除,动态操作逻辑需容忍这种竞态
动态集合名拼接要防注入
如果集合名来自用户输入(如租户 ID、日期字符串),直接拼接进 db.collection(userInput) 或 createCollection(userInput) 会导致非法命名或服务端拒绝(MongoDB 限制集合名不能含 $、.、空格、控制字符等)。
- 必须做白名单校验:只允许字母、数字、下划线、短横线,且长度 ≤ 128 字符
- 推荐用正则
/^[a-zA-Z0-9_-]{1,128}$/过滤,失败则抛出明确错误(如Invalid collection name format) - 避免用
Date.now()或随机数直接作集合名——时间戳精度太高易冲突,建议用YYYYMMDD+ 小写字母哈希(如logs_20260707_a3f8) - 特别注意:MongoDB 对数据库名和集合名都区分大小写,
Users和users是两个不同集合

















