MongoDB数据类型与python操作
一、MongoDB 数据类型
MongoDB 作为文档型数据库,支持丰富的数据类型,主要包括:
基本类型:
- 字符串(String):UTF-8 编码,支持索引。
- 数值(Number):包括 32 位整数(int)、64 位整数(long)、双精度浮点数(double,默认)、Decimal128(高精度小数)。
- 布尔值(Boolean):
true
或false
。 - 空值(Null):表示空值或不存在的字段。
复合 / 特殊类型:
- 对象 ID(ObjectId):12 字节唯一标识符,默认作为文档
_id
主键,包含时间戳、机器 ID 等信息。 - 日期(Date):存储 Unix 时间戳(毫秒级),不包含时区。
- 数组(Array):可包含多种类型元素,支持索引和查询(如
$in
、$all
)。 - 嵌入式文档(Embedded Document):文档中嵌套另一个文档,实现数据聚合。
- 二进制数据(Binary Data):存储图片、文件等二进制内容。
- 正则表达式(Regular Expression):支持正则匹配查询。
- 地理空间类型(Geospatial):如
Point
(点)、LineString
(线),支持地理位置查询。
- 对象 ID(ObjectId):12 字节唯一标识符,默认作为文档
二、MongoDB 与 MySQL、Redis 的对比
维度 | MongoDB(文档型) | MySQL(关系型) | Redis(键值型) |
---|---|---|---|
数据模型 | 文档(类似 JSON 的 BSON),支持嵌套和数组 | 二维表(行 + 列),遵循关系模型(外键关联) | 键值对(Key-Value),支持多种结构(字符串、哈希、列表等) |
存储方式 | 磁盘存储(支持内存映射优化) | 磁盘存储(InnoDB 等引擎) | 内存存储(可持久化到磁盘) |
事务支持 | 4.0+ 支持多文档事务,弱于 MySQL | 强事务支持(ACID 完整) | 单命令原子性,5.0+ 支持多命令事务 |
扩展性 | 天然支持分片(水平扩展) | 需分库分表(复杂) | 支持集群分片,扩展灵活 |
查询能力 | 丰富的查询语法(嵌套查询、聚合管道) | SQL 语法,支持复杂联表查询 | 简单键查询,依赖数据结构特性 |
适用场景 | 非结构化 / 半结构化数据(日志、内容管理)、快速迭代业务 | 结构化数据(订单、用户信息)、强事务需求 | 缓存、计数器、实时会话、高频读写场景 |
三、关系型数据库(RDBMS)与非关系型数据库(NoSQL)的核心区别
特性 | 关系型数据库(如 MySQL) | 非关系型数据库(如 MongoDB、Redis) |
---|---|---|
数据结构 | 固定 schema(表结构预定义) | 动态 schema(灵活扩展,无需预定义) |
关联处理 | 依赖外键和联表查询(JOIN) | 避免关联,通过嵌套或冗余存储数据 |
事务与一致性 | 强一致性(ACID) | 最终一致性(BASE),牺牲部分一致性换性能 |
扩展性 | 垂直扩展为主(升级硬件),水平扩展复杂 | 水平扩展为主(增加节点),天然支持分布式 |
适用场景 | 结构化数据、事务密集型(金融、电商订单) | 非结构化数据、高并发读写、快速迭代(社交、日志) |
四、Python 操作 MongoDB
Python 中通过 pymongo
库操作 MongoDB,步骤如下:
1. 安装依赖
pip install pymongo
2. 基本操作示例
from pymongo import MongoClient
from bson.objectid import ObjectId # 用于处理 ObjectId# 1. 连接 MongoDB(默认地址:localhost:27017)
client = MongoClient("mongodb://localhost:27017/")# 2. 创建/选择数据库(不存在则自动创建)
db = client["mydatabase"]# 3. 创建/选择集合(类似表)
collection = db["mycollection"]# 4. 插入文档
# 插入单条
doc = {"name": "Alice", "age": 30, "hobbies": ["reading", "hiking"]}
result = collection.insert_one(doc)
print("插入的文档 ID:", result.inserted_id)# 插入多条
docs = [{"name": "Bob", "age": 25, "city": "New York"},{"name": "Charlie", "age": 35, "city": "London"}
]
result = collection.insert_many(docs)
print("插入的多条文档 ID:", result.inserted_ids)# 5. 查询文档
# 查询单条
print(collection.find_one({"name": "Alice"}))# 查询多条(年龄 > 28)
for doc in collection.find({"age": {"$gt": 28}}):print(doc)# 6. 更新文档
# 更新单条(将 Alice 的年龄改为 31)
collection.update_one({"name": "Alice"},{"$set": {"age": 31}}
)# 7. 删除文档
# 删除单条(删除 name 为 Bob 的文档)
collection.delete_one({"name": "Bob"})# 8. 索引(提升查询性能)
collection.create_index("name", unique=True) # 唯一索引
3. 高级操作
聚合查询:使用
aggregate
实现分组、过滤等复杂计算:# 按城市分组,统计每个城市的人数 pipeline = [{"$group": {"_id": "$city", "count": {"$sum": 1}}} ] for result in collection.aggregate(pipeline):print(result)
分页查询:使用
skip
和limit
:# 跳过前 1 条,取 2 条 collection.find().skip(1).limit(2)
总结:MongoDB 适合灵活的非结构化数据场景,与 MySQL(强事务)、Redis(高性能缓存)互补;Python 通过 pymongo
可便捷操作 MongoDB,支持增删改查及复杂聚合。