MongoDB是目前应用最广泛的NoSQL数据库之一,和传统关系型数据库不同,它采用文档型存储模型,很多初学者刚开始接触时都会对它的数据类型和核心概念感到困惑。下面我们先通过一张示意图直观了解MongoDB的整体结构。

MongoDB核心基本概念
数据库(Database)
数据库是MongoDB中最高层级的存储单元,一个MongoDB实例可以包含多个数据库,不同的数据库之间数据相互隔离,通常用于区分不同的业务项目。比如电商项目可以用ecommerce_db,博客项目可以用blog_db。
集合(Collection)
集合相当于关系型数据库中的表,是文档的容器,同一个集合中的文档不需要有相同的字段结构,这也是MongoDB schema-less特性的体现。不过在实际开发中,通常建议同一个集合内的文档结构保持基本一致,方便后续查询和维护。
文档(Document)
文档是MongoDB中数据存储的基本单位,采用类似JSON的BSON格式,由字段和值对组成。每个文档都有一个唯一的_id字段作为主键,如果用户插入文档时没有指定_id,MongoDB会自动生成一个ObjectId类型的值。
MongoDB支持的数据类型
MongoDB的BSON格式支持多种数据类型,覆盖了大部分业务场景的需求,具体类型如下:
| 数据类型 | 说明 | 示例 |
|---|---|---|
| String | 字符串类型,UTF-8编码,最常用的类型 | "name": "张三" |
| Integer | 整型,分为32位和64位 | "age": 25 |
| Double | 双精度浮点型 | "price": 19.99 |
| Boolean | 布尔型,值为true或false | "is_active": true |
| ObjectId | 文档唯一标识,12字节的BSON类型 | "_id": ObjectId("645a1b2c3d4e5f60718293a0") |
| Array | 数组类型,可以存储多个值 | "tags": ["MongoDB", "NoSQL", "数据库"] |
| Object | 嵌入式文档,相当于嵌套的对象 | "address": {"city": "北京", "district": "海淀区"} |
| Null | 表示空值或不存在的字段 | "middle_name": null |
| Date | 日期类型,存储自Unix纪元以来的毫秒数 | "create_time": new Date("2024-05-20") |
| Binary Data | 二进制数据,用于存储图片、文件等 | 二进制字节流 |
| Regular Expression | 正则表达式,用于模式匹配查询 | "pattern": /test/i |
数据类型使用示例
下面通过一个完整的文档插入示例,展示不同数据类型的使用方式:
// 插入一个包含多种数据类型的文档到user集合
db.user.insertOne({
_id: ObjectId(), // ObjectId类型主键
name: "李四", // String类型
age: 28, // Integer类型
height: 175.5, // Double类型
is_vip: true, // Boolean类型
hobbies: ["篮球", "阅读", "编程"], // Array类型
address: { // Object类型(嵌入式文档)
province: "广东",
city: "深圳",
street: "科技园路123号"
},
last_login: new Date(), // Date类型
avatar: null, // Null类型
description: /开发工程师/ // 正则表达式类型
});注意事项
- ObjectId默认由时间戳、机器标识、进程ID和自增计数器组成,插入时间越早的文档,ObjectId的前几位越小,可以通过ObjectId间接获取文档的创建时间。
- 数组类型支持直接查询数组内的元素,比如查询hobbies包含"编程"的所有用户,不需要额外拆分字段。
- 嵌入式文档可以直接通过点号语法查询,比如查询address.city为"深圳"的文档,语法为
db.user.find({"address.city": "深圳"})。 - 虽然MongoDB支持无schema存储,但生产环境中建议通过校验规则限制集合内文档的结构,避免出现字段混乱的问题。
掌握MongoDB的数据类型和基本概念是使用它的第一步,这些知识会贯穿后续的索引创建、聚合查询、性能优化等所有操作,建议结合实际代码练习加深理解。