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

相关推荐
Goat恶霸詹姆斯12 分钟前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七35 分钟前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草36 分钟前
redis-9-哨兵
数据库·redis·bootstrap
space621232740 分钟前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
明哥说编程41 分钟前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0801 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥1 小时前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
惊讶的猫2 小时前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森2 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
全栈前端老曹3 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈