第1章:MongoDB 术语全景与文档数据库工作原理
1. 项目背景业务场景你加入了一家创业公司本地生活电商技术负责人告诉你公司要用 MongoDB 替代 MySQL 来支撑商品、订单和用户系统。你打开官方文档扑面而来的是 database、collection、document、BSON、replica set、shard、mongod、mongos……一堆陌生术语。更头疼的是同事说 MongoDB 是文档数据库但你发现它也有索引、也有 ACID 事务、也能做 JOIN——那它和关系型数据库到底有什么区别什么时候该用它什么时候不该痛点如果你不理解 MongoDB 的术语体系和架构原理后续学习就会陷入抄命令但不知道为什么的困境。典型的翻车现场把 MongoDB 当成 MySQL 用创建几十个集合到处做关联查询然后抱怨 MongoDB 慢。不理解文档模型把一对多关系全部用嵌入塞进一个文档写入时频繁导致文档膨胀和内存压力。搞不清 mongod、mongos、config server 的分工拿到分片集群的连接串就一通乱连读写全打在 mongos 上还不知道为什么。没有架构全景图团队内对这个数据在哪个 shard 上oplog 到底在干什么反复沟通降低协作效率。2. 项目设计小胖午饭后冲进工位嘴里还嚼着薯片大师大师我看了一上午 MongoDB 文档头晕眼花。什么 document、collection、BSON、replica set……我感觉自己在背英语单词。能不能用一句话告诉我MongoDB 到底是个啥大师放下手中的咖啡一句话好。MongoDB 是一个面向文档的分布式数据库你可以把它理解为一个超级 JSON 存储器——它用类似 JSON 的 BSON 格式存储数据天然支持嵌套和数组能水平扩展自带高可用。小胖JSON 存储器那不就是 Redis 吗小白从屏幕后面探出头不一样。Redis 主要是内存缓存数据在内存里虽然也能持久化但主要场景是缓存和消息队列。MongoDB 是正经的磁盘数据库数据持久写在 WiredTiger 存储引擎里。而且 Redis 的数据结构是 key-value、list、set、hashMongoDB 的核心单位是 document。大师小白说得对。你可以这样类比——Redis 像是黑板上的便利贴随手贴随手撕快但容量有限MongoDB 像是图书馆的书架书可以摆得很密每本书document内容可以很丰富还能按分类索引快速查找。技术映射Redis 定位为内存数据结构存储侧重低延迟缓存MongoDB 定位为通用文档数据库侧重灵活 schema 和持久存储。小胖哦……那它和 MySQL 又有什么区别我们以前全用 MySQL大师你为什么突然要换大师问得好。MySQL 是关系型数据库你需要先定义表结构schema每条记录必须严格符合列定义。比如用户表有 id、name、email 三列你不能随便加一个喜好标签列。MongoDB 的 document 没有固定字段约束——一个集合里的两个文档可以有完全不同的字段。小白但这也意味着脏数据的风险吧如果一个文档里 “age” 是数字另一个文档里 “age” 是字符串二十五查询的时候不就炸了大师没错这是灵活性必须付出的代价。所以 MongoDB 后来引入了 JSON Schema Validator可以在 collection 级别定义字段类型、必填、枚举值等约束。实际项目中我们通常会开启校验。技术映射关系型数据库RDBMS强调 schema-first适合结构化、关联性强、一致性要求高的场景MongoDB 强调 schema-flexible适合结构多变、嵌套复杂、读写模式简单且需要快速迭代的场景。小胖那 MongoDB 的术语怎么对应 MySQL 啊我脑子里的对比表是空的。大师画个表你就懂了MySQL 术语MongoDB 术语说明databasedatabase数据库一样tablecollection集合相当于表rowdocument文档相当于行columnfield字段相当于列primary key_id主键MongoDB 默认用 ObjectIdindexindex索引概念基本一致JOIN$lookup / 嵌入MongoDB 用嵌入或引用替代 JOIN小白我注意到 MongoDB 没有 JOIN 的等价概念$lookup 看起来不像 SQL JOIN 那么好用。如果我们有大量关联查询是不是不该用 MongoDB大师这就是选型关键。MongoDB 的设计哲学是数据随访问模式存。如果你的查询总是一起拿用户和他的收货地址那就把地址嵌在用户文档里——一次查询拿到全部。如果你像 MySQL 那样把地址拆到另一个表每次都要做两次查询或 $lookup不仅代码复杂性能也会下降。技术映射MongoDB 的嵌入模型适合一起读、一起写的数据引用模型适合独立读写、独立生命周期的数据。小胖文档里还提到了 mongod、mongos、replica set、shard这些又是什么鬼大师这就是 MongoDB 的架构全景。想象一个数据中心的物理架构mongod核心数据库进程负责存储数据、执行查询。单机模式下就一个 mongod 在干活。replica set复制集一组 mongod 节点一个 Primary主节点负责写入多个 Secondary从节点同步数据。Primary 挂了Secondary 自动选举接替——高可用。shard分片每个分片本身就是一个复制集。数据按分片键拆分到不同分片上——水平扩展。mongos分片集群的查询路由器客户端连接 mongosmongos 根据分片键把请求路由到正确的 shard。config server配置服务器存储分片集群的元数据哪个分片存了哪些数据。小白所以最小生产部署是 3 个 mongod 组成一个复制集如果要分片就是 N 个复制集 mongos config server大师一言蔽之。单机 复制集高可用 分片集群高可用 水平扩展。技术映射无论是单机、复制集还是分片集群数据最终都由 mongod 进程中的 WiredTiger 存储引擎持久化到磁盘通过 B-Tree 组织用 JournalWAL保证崩溃恢复。小胖我好像有点感觉了。总结一下MongoDB 用 BSON 格式存数据document 是基本单位collection 是 document 的容器database 是 collection 的容器。单机靠 mongod高可用靠复制集大规模靠分片集群。对不大师再加一句你写的每一条 find()、insertOne()都会经过Driver → 连接池 → mongod/mongos → 查询解析 → 执行引擎 → WiredTiger 存储引擎 → 磁盘这一整条链路。小白那 WiredTiger 是什么大师MongoDB 默认的存储引擎负责数据实际如何存到磁盘、如何读取、如何缓存。它用 B-Tree 组织数据有自己的缓存和并发控制机制。第 33 章我们会深入它。现在你先记住名字就行。3. 项目实战3.1 环境准备组件版本/工具用途MongoDB8.0Docker 官方镜像数据库服务Docker24容器运行环境mongosh最新版MongoDB 命令行客户端Compass最新版图形化管理工具启动单节点 MongoDB# 拉取镜像并启动单节点 MongoDBdockerrun-d\--namemongo-ch01\-p27017:27017\-eMONGO_INITDB_ROOT_USERNAMEadmin\-eMONGO_INITDB_ROOT_PASSWORDadmin123\mongo:8.0进入容器使用 mongoshdockerexec-itmongo-ch01 mongosh-uadmin-padmin123--authenticationDatabaseadmin3.2 分步实现步骤一理解 database 与 collection 的创建目标创建本地生活电商的第一个 database并在其中创建多个 collection。// 切换到或创建local_life 库use local_life// MongoDB 的 collection 是懒创建的——插入文档时才真正创建// 查看当前库中的所有集合show collections// 此时应该为空因为还没有插入任何文档可能遇到的坑use local_life执行后不会立即创建数据库只有第一次插入数据后数据库才真正存在。用show dbs验证时会发现刚 use 的库不显示。数据库名称不能为空、不能包含/ \ . * : | ? $等特殊字符小写为宜。步骤二理解 document 与 BSON 类型目标插入第一批业务文档观察 BSON 类型如何在 mongosh 中表现。// 插入一个用户文档db.users.insertOne({name:张三,age:28,email:zhangsanexample.com,tags:[新用户,手机端],address:{province:广东,city:深圳,detail:南山区科技园路1号},createdAt:newDate(),balance:NumberDecimal(99.99)// Decimal128 类型精确金额})// 查看插入结果db.users.find().pretty()运行结果命令行输出示例{ _id: ObjectId(6601a2b3c4d5e6f7a8b9c0d1), name: 张三, age: 28, email: zhangsanexample.com, tags: [ 新用户, 手机端 ], address: { province: 广东, city: 深圳, detail: 南山区科技园路1号 }, createdAt: ISODate(2026-03-20T08:30:00.000Z), balance: Decimal128(99.99) }技术要点_id如果未显式指定MongoDB 自动生成 ObjectId它是一个 12 字节的 BSON 类型结构为4 字节时间戳 5 字节随机值 3 字节计数器。金额推荐用NumberDecimal()而非double避免浮点精度问题如 0.1 0.2 ≠ 0.3。日期类型直接用new Date()存储为 BSON Date 类型UTC 时间戳。步骤三理解 namespace 与 cursor目标查询数据并理解 cursor 的概念。// 插入多条商品数据db.products.insertMany([{name:iPhone 16 手机壳,category:手机配件,price:29.9,stock:200},{name:蓝牙耳机,category:数码影音,price:199.0,stock:50},{name:充电宝 20000mAh,category:手机配件,price:89.0,stock:150}])// find() 返回的不是数据本身而是一个 cursor游标constcursordb.products.find({})// cursor 是一个迭代器mongosh 默认自动迭代前 20 条并展示// 可以手动迭代更多while(cursor.hasNext()){printjson(cursor.next().name)}可能遇到的坑mongosh 中find()返回的是 cursor如果数据量大mongosh 只展示前 20 条并在末尾显示Type it for more——输入it可以继续迭代。cursor 在服务端有超时时间默认 10 分钟长时间不消费会自动关闭。namespace 的全称是database.collection如local_life.products在系统监控中经常看到这种格式。步骤四理解索引的基本概念目标为商品集合创建第一个索引感受有索引和无索引的查询差异。// 先插入 10 万条模拟数据感受无索引的全表扫描for(leti0;i100000;i){db.products.insertOne({name:商品_i,category:类目_(i%100),price:Math.random()*1000,stock:Math.floor(Math.random()*500)})}// 查看查询执行计划无索引时db.products.find({category:类目_42}).explain(executionStats)// 观察 winningPlan.stage COLLSCAN全集合扫描// executionStats.totalDocsExamined 100000扫描了全部文档// 创建单字段索引db.products.createIndex({category:1})// 再次查看执行计划db.products.find({category:类目_42}).explain(executionStats)// 观察 winningPlan.stage IXSCAN索引扫描// executionStats.totalDocsExamined 大约 1000只扫描了命中索引的文档步骤五绘制 MongoDB 架构图目标用 Mermaid 绘制一张团队可复用的 MongoDB 架构全景图保存为mongo-architecture.mmd。mongod内部配置服务分片2-ReplicaSet分片1-ReplicaSet路由层-分片集群客户端层应用程序 Drivermongosh CLICompass GUImongos查询路由器Primary mongodSecondary mongodSecondary mongodPrimary mongodSecondary mongodSecondary mongodConfig ServerReplica Set查询解析 优化器执行引擎 SBE/ClassicWiredTiger 存储引擎磁盘B-Tree Journal代码解释客户端通过 Driver 或 CLI 发送请求在分片集群场景下先经过 mongos 路由。mongos 查询 config server 确定数据在哪个分片然后将请求转发到对应分片的 Primary 节点。mongod 进程内部查询解析器将 BSON 请求转为内部查询对象 → 执行引擎运行查询计划 → WiredTiger 从磁盘B-Tree或缓存中读写数据。单机/复制集场景下没有 mongos客户端直接连接 Primary mongod。3.3 完整代码清单本章实验代码包含以下文件文件用途ch01/docker-compose.yml单节点 MongoDB 启动配置ch01/init.js初始化脚本创建库、集合、插入样例数据ch01/query-demo.js演示查询、游标、explain 的脚本ch01/mongo-architecture.mmdMermaid 架构图源代码3.4 测试验证// 验证数据库和集合创建show dbs// 应能看到 local_lifedb.users.countDocuments()// 应为 1db.products.countDocuments()// 应为 100003含循环插入的 10 万条// 验证索引创建db.products.getIndexes()// 应看到 _id_ 和 category_1 两个索引// 清理测试数据可选db.products.dropIndex({category:1})db.products.drop()db.users.drop()4. 项目总结4.1 优缺点对比维度MongoDB文档型MySQL关系型对比结论Schema 灵活性极高无固定字段严格需先定义表结构MongoDB 适合快速迭代嵌套数据查询嵌入模式下一次查询完成需多次 JOINMongoDB 读路径更短复杂关联查询$lookup 性能较差JOIN 成熟高效MySQL 更适合报表分析事务支持4.0 支持多文档事务原生成熟差距已大幅缩小水平扩展原生分片集群需中间件如 ShardingSphereMongoDB 更简易生态与工具20 年积累尚浅40 年生态沉淀MySQL 工具链更丰富4.2 适用场景推荐使用 MongoDB内容管理CMS、博客、商品目录——结构多变嵌套多前端直接消费的 JSON。IoT 日志、事件存储——写入量大、数据结构扁平化、按时间范围查询。实时分析、用户行为追踪——数据不断增长聚合管道可替代简单离线报表。电商单品页——嵌套详情、规格、库存、评论一次查询获取完整页面数据。移动应用后端——开发速度快schema 与前端 JSON 直接映射。不推荐使用 MongoDB银行核心账务系统——需要极强的 ACID 保证和复杂的多表事务。高度关联的 ER 模型——如 ERP、供应链系统多表 JOIN 是核心操作。4.3 注意事项注意事项说明ObjectId 非严格单调递增同一秒内多机器生成的 _id 可能乱序不要依赖 _id 做严格时序排序文档大小限制 16MB单个 BSON document 不能超过 16MB大文本用 GridFS字段名影响存储每次插入都存储字段名短字段名能显著减少存储如用 “nm” 替代 “userDisplayName”数据库命名不能包含大写字母Windows 不区分大小写但 Linux 区分建议全小写集合命名避免以system.开头那是系统保留前缀4.4 常见踩坑经验故障案例一ObjectId 作为排序字段的坑某团队在对订单集合按创建时间排序时直接用sort({ _id: -1 })认为 ObjectId 前 4 字节是时间戳所以天然有序。结果某次大促两台应用服务器同时写入时_id 出现交错——前一个文档的 _id 时间戳部分比后一个大但实际物理时间相反。根因ObjectId 的时间戳精确到秒同一秒内不同机器生成的 _id 相对顺序取决于随机值部分。解决显式使用createdAt字段排序。故障案例二浮点数金额导致对账不平某电商最初用 Double 类型存储金额9.99 0.01 写入数据库后变成了 10.000000000000002月底财务对账发现 10 万笔交易累计偏差 0.03 元。根因IEEE 754 浮点数精度问题。解决改用NumberDecimal()或整数分以分为单位存 Long。故障案例三数据库名称区分大小写导致的连接错误开发在 macOS 上用use MyShop创建了数据库部署到 Linux 生产环境后应用报错 “database not found”。根因Linux 文件系统区分大小写MongoDB 在 Linux 上对数据库名也区分大小写。解决一律使用全小写数据库名在项目规范中明确规定。4.5 思考题如果在_id字段上创建索引会发生什么为什么 MongoDB 不需要我们在_id上手动建索引一个 document 嵌套了 100 层子文档查询第 99 层的字段WiredTiger 需要做什么额外的操作这和关系型数据库的 JOIN 有何异同答案将在第 2 章末尾揭晓延伸阅读与资源python入门Rquests从菜鸟脚本到企业级SDK的网络实战圣经Milvus向量数据库实战修炼从 0 到 1精通向量检索与生产落地后端工程师的 AI 转型第一课Ollama 与私有化大模型实战10倍开发者的 Dify 魔法书从零构建全栈 AI 应用后端工程师转型AI第一课-Ollama 与私有化大模型实战大型语言模型(LLM) vLLM 高性能推理落地实战Agent开发之LlamaIndex 实战修炼与源码进阶大语言模型Transformers 实战修炼与源码剖析

相关新闻

AsrTools语音转文字终极指南:免费快速将音频转为字幕的完整教程

AsrTools语音转文字终极指南:免费快速将音频转为字幕的完整教程

AsrTools语音转文字终极指南:免费快速将音频转为字幕的完整教程 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into …

2026/7/16 16:53:54阅读更多 →
使用多光源模式模拟复杂光源

使用多光源模式模拟复杂光源

在照明和成像领域,许多不同的应用都需要对复杂的光源模型进行模拟,如光源阵列或扩展光源。因此,我们要展示VirtualLab Fusion最新版本(2021.1)的一个新功能,它可以通过定义和组合不同的光源模式来配置此类光…

2026/7/16 16:53:54阅读更多 →
QMCDecode终极指南:3步轻松转换QQ音乐加密格式为通用音频

QMCDecode终极指南:3步轻松转换QQ音乐加密格式为通用音频

QMCDecode终极指南:3步轻松转换QQ音乐加密格式为通用音频 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…

2026/7/16 16:48:53阅读更多 →
鸿蒙 ArkTS 实战:Room Mood Light Control 从创作记录到状态反馈完整解析

鸿蒙 ArkTS 实战:Room Mood Light Control 从创作记录到状态反馈完整解析

鸿蒙 ArkTS 实战:Room Mood Light Control 从创作记录到状态反馈完整解析 前言 Room Mood Light Control 是一个面向 创作管理与灵感记录 的鸿蒙 ArkTS 小应用。记录创作条目、站点信息和提醒备注,适合日常创作复盘。 本文基于 entry/src/main/ets/pag…

2026/7/16 17:49:33阅读更多 →
散户量化交易入门:从Python回测到实盘实战完整指南

散户量化交易入门:从Python回测到实盘实战完整指南

散户量化交易完整指南:从零基础到实战应用在金融市场日益复杂的今天,越来越多的个人投资者开始关注量化交易这一专业领域。传统的主观交易容易受到情绪波动影响,而量化交易通过系统化的策略和严格的纪律,为散户投资者提供了新的可…

2026/7/16 17:49:33阅读更多 →
48V工业电源过压保护:撬棍电路设计与实战

48V工业电源过压保护:撬棍电路设计与实战

1. 过压保护电路的必要性与挑战在电子系统设计中,电源管理始终是工程师面临的核心挑战之一。我曾在工业自动化项目中亲历过这样的事故:一套价值数十万元的PLC控制系统因为电源模块的瞬态过压而烧毁,导致产线停工48小时。这种惨痛教训让我深刻…

2026/7/16 17:49:33阅读更多 →
AU-48 双模拟麦多功能语音处理模组:一颗芯片搞定降噪、消回音、USB 通话全场景

AU-48 双模拟麦多功能语音处理模组:一颗芯片搞定降噪、消回音、USB 通话全场景

做过音频通话产品的工程师都知道,"噪声"和"回音"是两座绕不过去的大山。今天聊的这颗 AU-48 模组,把 AI 降噪、100dB 消回音、USB 免驱全塞进了一个 2320mm 的邮票孔封装里——更关键的是,它还能无缝替换上一代 A-47&…

2026/7/16 17:49:33阅读更多 →
mlx-community/gemma-4-31b-it-nvfp4 vs 原版Gemma-4-31B-it:性能对比与选择指南 [特殊字符]

mlx-community/gemma-4-31b-it-nvfp4 vs 原版Gemma-4-31B-it:性能对比与选择指南 [特殊字符]

mlx-community/gemma-4-31b-it-nvfp4 vs 原版Gemma-4-31B-it:性能对比与选择指南 🚀 【免费下载链接】gemma-4-31b-it-nvfp4 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-31b-it-nvfp4 想要在Apple Silicon设备上运行强…

2026/7/16 17:49:33阅读更多 →
Clypra视频剪辑案例:制作专业的YouTube视频

Clypra视频剪辑案例:制作专业的YouTube视频

Clypra视频剪辑案例:制作专业的YouTube视频 【免费下载链接】Clypra A modern video editor built with Tauri, React, and TypeScript. Focus on building free capabilities of premium capcut functionalities 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/16 17:44:33阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/16 8:28:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/16 6:53:04阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/16 12:02:41阅读更多 →
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代…

2026/7/16 0:00:38阅读更多 →
遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

1. 项目概述:为什么用遗传算法解5皇后问题,而不是直接回溯?我带过十几届算法课,也给不少初创团队做过AI架构咨询。每次讲到组合优化问题,学生和工程师的第一反应永远是“写个回溯试试”。这没错——55棋盘上找所有合法…

2026/7/16 0:00:38阅读更多 →
5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

前几天调试一个简单的电源模块,用到了5.1V稳压管。电路接好,上电测试,万用表一量——输出居然只有4.7V。第一反应是稳压管坏了,换了一个新的,结果还是4.7V。这让我想起很多初学者都会遇到的困惑:明明标称5.…

2026/7/16 0:00:38阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →