MongoDB数据类型与python操作

一、MongoDB 数据类型

MongoDB 作为文档型数据库,支持丰富的数据类型,主要包括:

  1. 基本类型

    • 字符串(String):UTF-8 编码,支持索引。
    • 数值(Number):包括 32 位整数(int)、64 位整数(long)、双精度浮点数(double,默认)、Decimal128(高精度小数)。
    • 布尔值(Boolean):truefalse
    • 空值(Null):表示空值或不存在的字段。
  2. 复合 / 特殊类型

    • 对象 ID(ObjectId):12 字节唯一标识符,默认作为文档 _id 主键,包含时间戳、机器 ID 等信息。
    • 日期(Date):存储 Unix 时间戳(毫秒级),不包含时区。
    • 数组(Array):可包含多种类型元素,支持索引和查询(如 $in$all)。
    • 嵌入式文档(Embedded Document):文档中嵌套另一个文档,实现数据聚合。
    • 二进制数据(Binary Data):存储图片、文件等二进制内容。
    • 正则表达式(Regular Expression):支持正则匹配查询。
    • 地理空间类型(Geospatial):如 Point(点)、LineString(线),支持地理位置查询。

二、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. 安装依赖
python 复制代码
pip install pymongo
2. 基本操作示例
python 复制代码
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 实现分组、过滤等复杂计算:

    python 复制代码
    # 按城市分组,统计每个城市的人数
    pipeline = [
        {"$group": {"_id": "$city", "count": {"$sum": 1}}}
    ]
    for result in collection.aggregate(pipeline):
        print(result)
  • 分页查询 :使用 skiplimit

    python 复制代码
    # 跳过前 1 条,取 2 条
    collection.find().skip(1).limit(2)

总结:MongoDB 适合灵活的非结构化数据场景,与 MySQL(强事务)、Redis(高性能缓存)互补;Python 通过 pymongo 可便捷操作 MongoDB,支持增删改查及复杂聚合。

相关推荐
qianmo20213 小时前
gpt-4o+deepseek+R生成热力图表
java·数据库·r语言
Zfox_3 小时前
【C++项目】微服务即时通讯系统:服务端
数据库·c++·微服务·中间件·rpc·架构·即时通讯
TDengine (老段)3 小时前
TDengine 聚合函数 HISTOGRAM 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
寻星探路4 小时前
数据库造神计划第十八天---事务(1)
数据库
BullSmall4 小时前
Doris数据库-初识
数据库·doris
麦聪聊数据4 小时前
企业级数据库管理实战(七):SQL 到 API,让数据库成为团队的数据服务
数据库·sql·低代码·数据服务
一 乐4 小时前
智慧外贸平台|基于Java+vue的智慧外贸平台系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·外贸服务系统
黑马金牌编程5 小时前
总结一下MySQL数据库服务器性能优化的几个维度
服务器·数据库·mysql·性能优化
東雪蓮☆6 小时前
Redis 三种服务架构详解:主从复制、哨兵模式与集群
linux·运维·数据库·redis