字段名必须用小写字母加下划线,禁用.、$、空格、斜杠等非法字符;避免缩写以保语义清晰;时间字段统一用created_at/updated_at且值为ISODate;嵌套结构应自然分层而非扁平化堆砌前缀。

直接用小写字母加下划线,别缩写、别驼峰、别带点或$,这是最稳妥的起点。
字段名必须避开这些字符和格式
MongoDB 对字段名有硬性限制,违反会直接报错 FieldPath field names may not contain '.' or '$'。这不是风格问题,是语法错误。
-
.和$是保留字符:前者用于嵌套访问(如user.address.city),后者用于操作符(如$set),字段名里出现会导致解析失败 - 空格、控制字符(如
\0)、斜杠/、星号*等在底层文件系统层面也不被允许,数据库创建或写入时会拒绝 - 虽然 MongoDB 支持 UTF-8,但生产环境强烈建议只用 ASCII 小写字母 + 下划线,避免跨平台或驱动兼容性问题
为什么不用缩写,哪怕它看起来更短
缩写不是节省空间,而是制造歧义和映射成本。MongoDB 字段名本身不参与压缩(BSON 里字段名重复出现才被压缩),所谓“省内存”是误传。
-
addr可能是address、administrator、advertising—— 开发、运维、BI 同事看到都得猜 - ORM 或 ODM 映射时,
usr_nm→userName这类转换需要额外配置,出错率高 - 聚合管道里写
$group阶段时,{ _id: "$usr_nm" }比{ _id: "$user_name" }更易写错且难调试
时间字段命名要统一且可索引
别存字符串格式的 "2026-07-21 15:38:00",也别随意叫 ctime、ts、create_time —— 这些名字既不语义清晰,又不利于 TTL 索引或范围查询。
- 用
created_at和updated_at(全小写下划线),这是社区事实标准,ORM/ODM 默认识别 - 值类型必须是
Date(即 BSON 的ISODate()),不是字符串也不是数字时间戳 —— 否则db.collection.createIndex({ created_at: 1 })无法高效支持范围查询 - 如果业务需要毫秒级精度或时区信息,仍用
created_at字段,但确保写入时用new Date()或等效 ISO 格式,不要手动拼字符串
嵌套字段名要反映层级语义,而非堆砌前缀
别为了“扁平化”把嵌套路径硬搓成一级字段,比如 user_address_city;也别为了“简洁”把多层语义压成模糊缩写,比如 usr_prof_loc。
- 正确做法是自然嵌套:
{"user": {"profile": {"location": {"city": "Beijing", "country": "CN"}}}} - 这样查
db.users.find({ "user.profile.location.city": "Beijing" })清晰可读,也能为user.profile.location整体建索引 - 避免无意义的重复前缀,比如
{"user_info": {"user_name": "Alice", "user_email": "a@b.c"}}—— 外层 key 已表明上下文,内层再加user_是冗余
真正容易被忽略的是:字段名一旦写入大量文档,重命名成本极高。没有 ALTER COLUMN,只能靠应用层双写+迁移+清理,过程中还要处理新旧字段并存的逻辑分支。所以定名不是写代码前的“准备动作”,而是数据契约的第一行签字。


















