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

相关推荐
TDengine (老段)5 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)5 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
安当加密6 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a6 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽6 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康6 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy6 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎
ytttr8737 小时前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#
盒马coding8 小时前
第18节-索引-Partial-Indexes
数据库·postgresql
不剪发的Tony老师8 小时前
CloudDM:一站式数据库开发管理工具
数据库