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中被视为完全不同的文档,因为键 name
和 Name
的大小写不同。
{ "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
}