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,支持增删改查及复杂聚合。

相关推荐
SAP小崔说事儿4 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap
川贝枇杷膏cbppg5 小时前
asmcmd
数据库·oracle
JIngJaneIL6 小时前
基于java+ vue助农电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
IndulgeCui6 小时前
基于CentOS7 DM8单机部署配置记录-20251216
数据库
surtr16 小时前
关系代数与关系型数据库
数据库·sql·数据库系统
学海_无涯_苦作舟6 小时前
MySQL面试题
数据库·mysql·面试
老邓计算机毕设6 小时前
SSM校内二手书籍交易系统的设计与实现an1k0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 框架开发·ssm 校内二手书籍交易系统
天行健,君子而铎7 小时前
高性能、可控、多架构:教育行业数据库风险监测一体化解决方案
数据库·架构
Stella25217 小时前
实习日志|知识总结
linux·服务器·软件测试·数据库