当前位置: 首页 > news >正文

MongoDB文档规范

1. 文档中的键/值对是有序的

MongoDB会保留您插入文档时键/值对的顺序。

例子:
假设我们插入一个关于用户的文档,我们希望“姓名”总是在“年龄”之前。

{"name": "张三","age": 30,"city": "北京"
}

当您查询这个文档时,MongoDB会按照 name, age, city 的顺序返回这些字段,这有助于保持数据的可读性和结构的一致性。

2. 值的多样性:不仅仅是字符串

文档中的值可以是多种数据类型,例如数字、布尔值、数组,甚至是另一个完整的文档(嵌入式文档)。

例子:
这个例子展示了一个更复杂的个人信息文档,其中包含了各种数据类型。

{"name": "李四","age": 25,"is_student": true,"courses": ["数学", "物理", "计算机科学"],"address": {"street": "科技路123号","city": "上海","zip_code": "200000"}
}
  • "name" 是一个字符串。
  • "age" 是一个数字。
  • "is_student" 是一个布尔值 (true)。
  • "courses" 是一个包含多个字符串的数组。
  • "address" 是一个嵌入式文档,有自己的一套键值对。

3. MongoDB 区分类型和大小写

MongoDB在处理文档的键和值时,会严格区分数据类型和大小写。

大小写敏感

例子:
以下两个文档在MongoDB中被视为完全不同的文档,因为键 nameName 的大小写不同。

{ "name": "王五" }
{ "Name": "王五" }

如果您想查询 "name""王五" 的文档,只会返回第一个文档。

类型敏感

例子:
以下两个文档中的age值,一个是数字 28,另一个是字符串 "28",MongoDB会认为它们是不同的。

{ "age": 28 }
{ "age": "28" }

如果您查询 age 等于数字 28 的文档,将不会匹配到第二个文档。

4. 文档的键不能重复

在一个MongoDB文档中,每个键都必须是唯一的。 如果您尝试插入一个有重复键的文档,通常只有最后一个键值对会被保留,但这取决于所使用的驱动程序。

例子:
如果您尝试插入如下文档:

{"topic": "数据库","author": "赵六","topic": "MongoDB"
}

MongoDB在保存时,只会保留最后一个 "topic" 的值。最终存入的文档会是:

{"topic": "MongoDB","author": "赵六"
}

5. 文档的键是字符串 (UTF-8)

文档的键必须是字符串,并且可以使用大多数UTF-8字符,但有一些特定的限制。


文档键命名规范详解

1. 键不能含有 \0 (空字符)

\0 字符在内部被用来标记一个键的结束,因此不能出现在键名中。

错误的例子:

{ "first\0name": "孙七" }
2. .$ 有特殊意义
  • . (点/句号): 点号通常用来访问嵌入文档的元素。虽然新版本的MongoDB(5.0及以上)在存储上支持键名包含 .,但在查询时可能会引起混淆和错误,因此强烈建议避免在键名中使用。

    例子 (应避免):

    { "user.name": "周八" }
    

    MongoDB在查询时可能会将其误解为在一个名为 user 的嵌入文档中查找 name 字段。

    推荐的做法是使用嵌入文档:

    {"user": {"name": "周八"}
    }
    
  • $ (美元符号): 美元符号通常用作查询和更新操作符的前缀(例如 $set, $gt 等)。虽然新版本同样在存储上支持了 $,但为了避免与操作符冲突,强烈建议不要用 $ 作为键名的开头。

    错误的例子 (应避免):

    { "$user": "吴九" }
    
3. 以下划线 _ 开头的键是保留的

虽然不是严格禁止,但以 _ 开头的键名通常为MongoDB内部或特定框架保留使用。其中最重要的就是 _id

  • _id:这是每个文档的主键。它的值在集合中必须是唯一的。如果您在插入文档时不提供 _id,MongoDB会自动生成一个。

例子:
一个带有自动生成 _id 的文档看起来像这样:

{"_id": ObjectId("632a0b8c9d7a2b4d8c7e4f2a"),"product_name": "笔记本电脑","price": 7999
}
http://www.dtcms.com/a/391086.html

相关文章:

  • 让设计、办公、创作效率翻倍的技术文章大纲
  • 能不能写一个linux下类vim的编辑器
  • Linux02: 编辑器nano的常用技巧
  • UDP和TCP对比通俗讲解
  • 【ReText】1.3 Python multiprocessing 库详解
  • Liunx系统下出现“Could not resolve host: mirrorlist.centos.org; 未知的错误”地解决方案
  • CentOS Stream 9安装系统(LVM扩容案例)
  • Docusign AI 全球化:构建安全、合规的多语言协议管理
  • C# 基于halcon的视觉工作流-章37-零件测量
  • 第二部分:VTK核心类详解(第38章 vtkPointData点数据类)
  • 木卫四科技 × 一汽解放商用车开发院: 共驱商用车 AI 研发新程
  • 【C++闯关笔记】STL:stack与queue的学习和使用
  • [HCTF 2018] WarmUp
  • Vue 学习随笔系列二十六 —— 动态表头
  • BIM 可视化运维平台 + IBMS 中央集成系统一体化解决方案:构建虚实融合的智慧运营中枢
  • XSUN_DESKTOP_PET(桌面宠物)
  • 具身智能VR遥操开发记录
  • 构建AI智能体:三十八、告别“冷启动”:看大模型如何解决推荐系统的世纪难题
  • [重学Rust]之结构体打印和转换
  • 数据结构(陈越,何钦铭) 第十一讲 散列查找
  • 2025年JBD SCI2区TOP,基于改进蚁群算法的应急路径规划,深度解析+性能实测
  • UIKit-layer
  • 一物一码公司推荐再互动平台
  • Wireshark捕获MQTT报文
  • Docker镜像核心作战手册:镜像命令全解析+离线迁移实战+压缩共享储存,打造无缝跨环境部署!
  • Static Deinitialization Order Fiasco
  • 如何使用 Qt Creator 高效调试
  • 保障路灯用电安全!配电箱漏电检测,为城市照明筑牢防线
  • 不同版本tensorflow推理报错解决方法
  • 嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门