monsqlize 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +92 -2419
  2. package/README.md +630 -1070
  3. package/index.d.ts +252 -15
  4. package/lib/cache.js +8 -8
  5. package/lib/common/validation.js +64 -1
  6. package/lib/connect.js +3 -3
  7. package/lib/errors.js +10 -0
  8. package/lib/index.js +118 -9
  9. package/lib/infrastructure/ssh-tunnel-ssh2.js +211 -0
  10. package/lib/infrastructure/ssh-tunnel.js +40 -0
  11. package/lib/infrastructure/uri-parser.js +35 -0
  12. package/lib/lock/Lock.js +66 -0
  13. package/lib/lock/errors.js +27 -0
  14. package/lib/lock/index.js +12 -0
  15. package/lib/logger.js +1 -1
  16. package/lib/model/examples/test.js +4 -4
  17. package/lib/mongodb/common/accessor-helpers.js +17 -3
  18. package/lib/mongodb/connect.js +68 -13
  19. package/lib/mongodb/index.js +140 -7
  20. package/lib/mongodb/management/collection-ops.js +4 -4
  21. package/lib/mongodb/management/index-ops.js +18 -18
  22. package/lib/mongodb/management/validation-ops.js +3 -3
  23. package/lib/mongodb/queries/aggregate.js +14 -5
  24. package/lib/mongodb/queries/chain.js +52 -45
  25. package/lib/mongodb/queries/count.js +16 -6
  26. package/lib/mongodb/queries/distinct.js +15 -6
  27. package/lib/mongodb/queries/find-and-count.js +22 -13
  28. package/lib/mongodb/queries/find-by-ids.js +5 -5
  29. package/lib/mongodb/queries/find-one-by-id.js +1 -1
  30. package/lib/mongodb/queries/find-one.js +12 -3
  31. package/lib/mongodb/queries/find-page.js +12 -0
  32. package/lib/mongodb/queries/find.js +15 -6
  33. package/lib/mongodb/queries/index.js +1 -0
  34. package/lib/mongodb/queries/watch.js +537 -0
  35. package/lib/mongodb/writes/delete-many.js +20 -11
  36. package/lib/mongodb/writes/delete-one.js +18 -9
  37. package/lib/mongodb/writes/find-one-and-delete.js +19 -10
  38. package/lib/mongodb/writes/find-one-and-replace.js +36 -20
  39. package/lib/mongodb/writes/find-one-and-update.js +36 -20
  40. package/lib/mongodb/writes/increment-one.js +16 -7
  41. package/lib/mongodb/writes/index.js +13 -13
  42. package/lib/mongodb/writes/insert-batch.js +46 -37
  43. package/lib/mongodb/writes/insert-many.js +22 -13
  44. package/lib/mongodb/writes/insert-one.js +18 -9
  45. package/lib/mongodb/writes/replace-one.js +33 -17
  46. package/lib/mongodb/writes/result-handler.js +14 -14
  47. package/lib/mongodb/writes/update-many.js +34 -18
  48. package/lib/mongodb/writes/update-one.js +33 -17
  49. package/lib/mongodb/writes/upsert-one.js +25 -9
  50. package/lib/operators.js +1 -1
  51. package/lib/redis-cache-adapter.js +3 -3
  52. package/lib/slow-query-log/base-storage.js +69 -0
  53. package/lib/slow-query-log/batch-queue.js +96 -0
  54. package/lib/slow-query-log/config-manager.js +195 -0
  55. package/lib/slow-query-log/index.js +237 -0
  56. package/lib/slow-query-log/mongodb-storage.js +323 -0
  57. package/lib/slow-query-log/query-hash.js +38 -0
  58. package/lib/transaction/DistributedCacheLockManager.js +240 -5
  59. package/lib/transaction/Transaction.js +1 -1
  60. package/lib/utils/objectid-converter.js +566 -0
  61. package/package.json +11 -5
package/README.md CHANGED
@@ -1,21 +1,22 @@
1
- # monSQLize
2
-
3
1
  <div align="center">
4
2
 
5
- **高性能 MongoDB 增强库 - 智能缓存 + 事务优化 + 企业级特性**
3
+ # 🚀 monSQLize
4
+
5
+ ### MongoDB 的性能加速器 - 让数据库查询快 10~100 倍
6
+
7
+ **100% API 兼容 · 零学习成本 · 开箱即用**
6
8
 
7
9
  [![npm version](https://img.shields.io/npm/v/monsqlize.svg)](https://www.npmjs.com/package/monsqlize)
8
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
11
+ [![Test Coverage](https://img.shields.io/badge/Coverage-77%25-brightgreen.svg)](https://codecov.io/gh/vextjs/monSQLize)
9
12
  [![MongoDB](https://img.shields.io/badge/MongoDB-4.4%2B-green.svg)](https://www.mongodb.com/)
10
- [![Performance](https://img.shields.io/badge/Performance-10--100x-red.svg)]()
11
- [![Coverage](https://img.shields.io/badge/Coverage-77%25-brightgreen.svg)]()
13
+ [![Node.js](https://img.shields.io/badge/Node.js-16%2B-brightgreen)](https://nodejs.org/)
12
14
 
13
- [![Node.js](https://img.shields.io/badge/Node.js-14%2B-brightgreen)](https://nodejs.org/)
14
- [![MongoDB Driver](https://img.shields.io/badge/Driver-4.x%20%7C%205.x%20%7C%206.x%20%7C%207.x-blue)](docs/COMPATIBILITY.md)
15
- [![Module](https://img.shields.io/badge/Module-CommonJS%20%7C%20ESM-purple)]()
16
- [![Compatibility](https://img.shields.io/badge/Compatibility-Matrix-purple)](docs/COMPATIBILITY.md)
15
+ ```bash
16
+ npm install monsqlize
17
+ ```
17
18
 
18
- **[快速开始](#-快速开始)** | **[核心特性](#-核心特性)** | **[完整文档](./docs/INDEX.md)** | **[示例代码](./examples/)** | **[路线图](#-产品路线图)** | **[兼容性](./docs/COMPATIBILITY.md)**
19
+ [快速开始](#-快速开始) · [为什么选择](#-为什么选择-monsqlize) · [核心特性](#-核心特性) · [完整文档](./docs/INDEX.md)
19
20
 
20
21
  </div>
21
22
 
@@ -23,970 +24,777 @@
23
24
 
24
25
  ## 📑 目录
25
26
 
26
- - [简介](#-简介)
27
- - [为什么选择 monSQLize](#-为什么选择-monsqlize)
28
- - [快速开始](#-快速开始)
29
- - [核心特性](#-核心特性)
30
- - [MongoDB 原生功能](#-mongodb-原生功能100-支持)
31
- - [monSQLize 增强功能](#-monsqlize-增强功能)
32
- - [性能优势](#-性能优势)
33
- - [安装](#-安装)
34
- - [基础使用](#-基础使用)
35
- - [连接数据库](#1-连接数据库)
36
- - [CRUD 操作](#2-crud-操作)
37
- - [智能缓存](#3-智能缓存)
38
- - [事务支持](#4-事务支持)
39
- - [分布式部署](#5-分布式部署)
40
- - [跨库访问](#6-跨库访问)
41
- - [进阶功能](#-进阶功能)
42
- - [便利方法](#便利方法)
43
- - [批量操作](#高性能批量插入)
44
- - [链式调用](#链式调用-api)
45
- - [深度分页](#深度分页)
46
- - [聚合查询](#聚合查询)
47
- - [完整文档](#-完整文档)
48
- - [兼容性](#-兼容性)
49
- - [产品路线图](#-产品路线图)
50
- - [贡献指南](#-贡献指南)
51
-
52
- ---
53
-
54
- ## 🎯 简介
55
-
56
- **monSQLize** 是一个专为 MongoDB 设计的高性能增强库。
57
-
58
- 在保持 **100% MongoDB API 兼容**的同时,提供:
59
- - ⚡ **智能缓存系统** - 10-100倍性能提升,TTL/LRU/自动失效
60
- - 🔄 **事务管理优化** - 自动管理 + 优化,减少 30% DB 访问
61
- - 🌐 **分布式部署支持** - Redis Pub/Sub 实现多实例缓存一致性
62
- - 🛠️ **运维监控** - 慢查询日志、性能指标、健康检查
63
- - 📦 **便利方法** - 减少 60-80% 代码量
27
+ - [⚡ 性能对比](#-性能对比)
28
+ - [🎯 一句话介绍](#-一句话介绍)
29
+ - [💡 为什么选择 monSQLize?](#-为什么选择-monsqlize)
30
+ - [🎯 何时使用 monSQLize?](#-何时使用-monsqlize)
31
+ - [🚀 快速开始](#-快速开始)
32
+ - [🌟 核心特性](#-核心特性)
33
+ - [1. ⚡ 智能缓存系统](#1--智能缓存系统---性能提升-10100-倍)
34
+ - [2. 🔄 事务管理优化](#2--事务管理优化---减少-30-数据库访问)
35
+ - [3. 📦 便利方法](#3--便利方法---减少-6080-代码)
36
+ - [4. 🌐 分布式部署支持](#4--分布式部署支持)
37
+ - [5. 🆕 业务级分布式锁](#5--业务级分布式锁v140)
38
+ - [6. 🚀 高性能批量插入](#6--高性能批量插入)
39
+ - [7. 📊 深度分页](#7--深度分页---支持千万级数据)
40
+ - [8. 🛠️ 运维监控](#8-️-运维监控开箱即用)
41
+ - [9. 🔐 SSH隧道](#9--ssh隧道---安全连接内网数据库v13)
42
+ - [📊 性能测试报告](#-性能测试报告)
43
+ - [🎨 完整功能清单](#-完整功能清单)
44
+ - [🆚 与 MongoDB 原生驱动对比](#-与-mongodb-原生驱动对比)
45
+ - [🚀 快速迁移指南](#-快速迁移指南)
46
+ - [📖 完整文档](#-完整文档)
47
+ - [🌍 兼容性](#-兼容性)
48
+ - [🗺️ 产品路线图](#️-产品路线图)
49
+ - [🤝 贡献指南](#-贡献指南)
50
+ - [📄 许可证](#-许可证)
51
+ - [💬 社区与支持](#-社区与支持)
52
+
53
+ ---
54
+
55
+ ## 性能对比
64
56
 
65
- **设计理念**:
66
- - ✅ **零学习成本** - 完全兼容 MongoDB 原生 API,无需学习新语法
67
- - ✅ **渐进式采用** - 可以与原生驱动混用,逐步迁移
68
- - ✅ **性能优先** - 专注于性能优化和生产可靠性
69
- - ✅ **文档齐全** - 100% API 文档 + 50+ 可运行示例
70
-
71
- **未来计划**: v2.x 将支持 MySQL、PostgreSQL 等数据库的统一 MongoDB 风格 API([查看路线图](#-产品路线图))
72
-
73
- **适用场景**:
74
- - 🚀 需要高性能缓存的 MongoDB 应用
75
- - 🔄 需要事务支持的业务逻辑
76
- - 🌐 需要分布式部署的多实例应用
77
- - 🛠️ 需要运维监控的生产环境
78
- - 📊 需要深度分页的大数据展示
79
-
80
- ---
81
-
82
- ## 🆚 与 MongoDB 原生驱动对比
83
-
84
- | 特性 | 原生驱动 | monSQLize |
85
- |------|---------|-----------|
86
- | **基础功能** | ✅ 完整 | ✅ **100% 兼容** |
87
- | **缓存系统** | ❌ | ✅ TTL/LRU/自动失效 |
88
- | **便利方法** | ❌ | ✅ 5个(减少60-80%代码)|
89
- | **事务优化** | ❌ | ✅ -30% DB访问 |
90
- | **批量优化** | 慢 | ✅ **25x 性能提升** |
91
- | **分布式支持** | ❌ | ✅ Redis 广播 |
92
- | **运维监控** | 需配置 | ✅ 开箱即用 |
93
-
94
- **完全兼容 - 可以无缝替换**:
95
57
  ```javascript
96
- // 从原生驱动迁移,只需修改初始化
97
- // const { MongoClient } = require('mongodb');
98
- const MonSQLize = require('monsqlize');
99
-
100
- // 初始化改为 monSQLize
101
- const db = new MonSQLize({
102
- type: 'mongodb',
103
- config: { uri: 'mongodb://localhost:27017/mydb' }
104
- });
105
- await db.connect();
58
+ // MongoDB 原生驱动
59
+ const users = await collection.find({ status: 'active' }).toArray(); // 50ms
60
+ const product = await products.findOne({ _id: productId }); // 10ms
106
61
 
107
- // ✅ 所有 MongoDB API 保持不变
108
- const users = db.collection('users');
109
- await users.findOne({ _id: userId }); // 完全相同的 API
110
- await users.insertOne({ name: 'Alice' });
111
- await users.updateOne({ _id: userId }, { $set: { age: 31 } });
62
+ // ✅ monSQLize(启用缓存)
63
+ const users = await collection.find({ status: 'active' }, { cache: 60000 }); // 0.5ms ⚡ 100x faster
64
+ const product = await products.findOne({ _id: productId }, { cache: 60000 }); // 0.1ms ⚡ 100x faster
112
65
  ```
113
66
 
114
- ---
115
-
116
- ## 🌟 为什么选择 monSQLize?
117
-
118
- ### 对比 MongoDB 原生驱动
119
-
120
- | 特性 | MongoDB 原生 | **monSQLize** | 提升 |
121
- |------|-------------|--------------|------|
122
- | **基础 CRUD** | ✅ | ✅ | 功能相同 |
123
- | **智能缓存** | ❌ | ✅ TTL/LRU/自动失效 | **10-100x 性能提升** |
124
- | **批量插入** | 慢 | ✅ 高性能批处理 | **10-50x 性能提升** |
125
- | **事务支持** | 手动管理 | ✅ 自动管理 + 优化 | **-30% DB 访问** |
126
- | **深度分页** | ❌ 性能差 | ✅ 游标分页 | **支持千万级数据** |
127
- | **分布式部署** | ❌ 缓存不一致 | ✅ Redis 广播 | **多实例一致性** |
128
- | **运维监控** | 需配置 | ✅ 开箱即用 | **开箱即用** |
129
- | **开发效率** | 标准 | ✅ 便利方法 | **减少 60-80% 代码** |
130
-
131
- ### 关键优势
132
-
133
- 1. **🚀 10-100倍性能提升**
134
- - 智能缓存系统(TTL/LRU/命名空间失效)
135
- - 高性能批量插入(10-50x)
136
- - 只读事务优化(-30% DB访问)
137
- - 文档级别锁(16倍并发)
138
-
139
- 2. **⚡ 开发效率提升 60-80%**
140
- - 便利方法(findOneById、findByIds、upsertOne、incrementOne)
141
- - 自动缓存失效
142
- - 完整的 TypeScript 类型支持
143
- - 链式调用 API
144
-
145
- 3. **🌐 企业级特性**
146
- - ✅ 完整的事务支持(自动/手动管理)
147
- - ✅ 分布式部署支持(Redis Pub/Sub)
148
- - ✅ Admin/Management 功能(运维监控、Schema验证)
149
- - ✅ 慢查询日志、性能监控
150
-
151
- 4. **📖 文档完整、测试齐全**
152
- - ✅ 100% API 文档覆盖
153
- - ✅ 77%+ 测试覆盖率
154
- - ✅ 50+ 可运行示例
155
- - ✅ 详细的最佳实践指南
67
+ **只需在初始化时配置缓存,业务代码一行不改,性能立即提升!**
156
68
 
157
69
  ---
158
70
 
159
- ## 🤔 何时使用 monSQLize?
160
-
161
- ### ✅ 适合使用的场景
162
-
163
- - 🚀 **高并发读取场景** - 查询重复度高,缓存命中率 > 30%
164
- - 💰 **性能敏感应用** - 需要 10-100倍性能提升
165
- - 🔄 **复杂事务逻辑** - 需要可靠的事务管理和优化
166
- - 🌐 **多实例部署** - 需要分布式缓存一致性
167
- - 📊 **大数据分页** - 千万级数据的深度分页
168
- - 🛠️ **需要运维监控** - 慢查询日志、性能指标、健康检查
71
+ ## 🎯 一句话介绍
169
72
 
170
- ### ⚠️ 可能不适合
73
+ monSQLize 是一个**100% 兼容 MongoDB API** 的增强库。
171
74
 
172
- - 📝 **纯写入场景** - 大量写入,很少查询(缓存作用有限)
173
- - 🔒 **极端低延迟要求** - 要求 < 1ms 响应(缓存会增加微小开销)
174
- - 🎯 **简单 CRUD** - 简单应用,不需要缓存和优化
175
- - 🏃 **快速原型阶段** - 还在探索需求,架构未定
75
+ 在保持完全兼容的前提下,为你的应用提供:
176
76
 
177
- ### 🤝 渐进式采用
77
+ <table>
78
+ <tr>
79
+ <td width="25%" align="center">
80
+ <h3>🚀</h3>
81
+ <h4>智能缓存</h4>
82
+ <p>LRU/TTL 策略<br>自动失效<br>10~100 倍性能提升</p>
83
+ </td>
84
+ <td width="25%" align="center">
85
+ <h3>🔄</h3>
86
+ <h4>事务优化</h4>
87
+ <p>自动管理<br>只读优化<br>减少 30% DB 访问</p>
88
+ </td>
89
+ <td width="25%" align="center">
90
+ <h3>🌐</h3>
91
+ <h4>分布式支持</h4>
92
+ <p>Redis 广播<br>多实例一致性<br>业务级分布式锁</p>
93
+ </td>
94
+ <td width="25%" align="center">
95
+ <h3>🔐</h3>
96
+ <h4>SSH 隧道</h4>
97
+ <p>安全连接内网数据库<br>密码/私钥认证<br>开箱即用</p>
98
+ </td>
99
+ </tr>
100
+ </table>
178
101
 
179
- **好消息**: monSQLize 100% 兼容 MongoDB 原生驱动
180
-
181
- ```javascript
182
- // ✅ 可以混用
183
- const nativeDriver = require('mongodb');
184
- const MonSQLize = require('monsqlize');
185
-
186
- // 性能敏感的查询用 monSQLize(启用缓存)
187
- const hotQueries = new MonSQLize({
188
- cache: { maxSize: 100000 } // 全局启用缓存
189
- });
190
-
191
- // 简单查询用原生驱动
192
- const client = await nativeDriver.MongoClient.connect('...');
193
-
194
- // ✅ 可以逐步迁移
195
- // 1. 先在热点查询启用缓存
196
- // 2. 观察效果
197
- // 3. 逐步扩展到更多场景
198
- ```
102
+ **设计理念**:零学习成本 · 渐进式采用 · 性能优先 · 生产可靠
199
103
 
200
104
  ---
201
105
 
202
- ## 快速开始
106
+ ## 💡 为什么选择 monSQLize?
203
107
 
204
- ### 5 分钟上手
108
+ ### 你遇到的问题
205
109
 
206
- ```bash
207
- npm install monsqlize
208
- ```
110
+ <table>
111
+ <tr>
112
+ <td width="50%">
209
113
 
210
- ```javascript
211
- const MonSQLize = require('monsqlize');
114
+ **😫 数据库性能瓶颈**
115
+ - 高并发时查询变慢
116
+ - 热点数据重复查询数据库
117
+ - 聚合统计拖慢响应速度
118
+ - 用户抱怨页面加载慢
212
119
 
213
- // 1. 连接数据库
214
- const db = new MonSQLize({
215
- type: 'mongodb',
216
- config: { uri: 'mongodb://localhost:27017/mydb' }
217
- });
120
+ **😫 代码重复繁琐**
121
+ - ObjectId 转换到处都是
122
+ - 批量查询要写很多代码
123
+ - Upsert 操作不够直观
124
+ - 事务代码复杂易错
218
125
 
219
- const { collection } = await db.connect();
126
+ **😫 多实例部署问题**
127
+ - 缓存不一致导致脏读
128
+ - 定时任务重复执行
129
+ - 库存扣减并发冲突
130
+ - 需要额外的锁机制
220
131
 
221
- // 2. 基础 CRUD
222
- const users = collection('users');
132
+ </td>
133
+ <td width="50%">
223
134
 
224
- // 插入
225
- await users.insertOne({ name: 'Alice', age: 30 });
135
+ **✅ monSQLize 的解决方案**
136
+ - **智能缓存系统** - 热点数据走缓存,10~100倍性能提升
137
+ - **自动失效机制** - 写操作自动清理,保证数据一致性
138
+ - **缓存命中率 70~90%** - 真实业务场景验证
139
+ - **响应时间 < 1ms** - 从 10~50ms 降至毫秒级
226
140
 
227
- // 查询(启用缓存 5 秒)
228
- const alice = await users.findOne({ name: 'Alice' }, { cache: 5000 });
141
+ **✅ monSQLize 的解决方案**
142
+ - **便利方法** - findOneById、findByIds、upsertOne
143
+ - **自动转换 ObjectId** - 无需手动处理
144
+ - **语义化 API** - 代码更清晰易读
145
+ - **事务自动管理** - withTransaction 简化事务代码
229
146
 
230
- // 更新(自动失效缓存)
231
- await users.updateOne({ name: 'Alice' }, { $set: { age: 31 } });
147
+ **✅ monSQLize 的解决方案**
148
+ - **Redis 广播** - 多实例缓存自动同步
149
+ - **分布式锁** - 解决并发控制问题
150
+ - **定时任务防重** - tryAcquireLock 机制
151
+ - **开箱即用** - 配置简单,无需额外组件
232
152
 
233
- // 3. 便利方法 - 减少 80% 代码
234
- const user = await users.findOneById('507f1f77bcf86cd799439011');
235
- await users.upsertOne({ email: 'alice@example.com' }, { name: 'Alice' });
236
- await users.incrementOne({ _id: userId }, 'viewCount', 1);
153
+ </td>
154
+ </tr>
155
+ </table>
237
156
 
238
- // 4. 事务支持
239
- await db.withTransaction(async (session) => {
240
- await users.updateOne({ _id: userId }, { $inc: { balance: -100 } }, { session });
241
- await orders.insertOne({ userId, amount: 100 }, { session });
242
- });
243
-
244
- // 5. 深度分页
245
- const result = await users.findPage({
246
- query: { status: 'active' },
247
- page: 1,
248
- limit: 20,
249
- totals: {
250
- mode: 'async', // 异步统计
251
- ttl: 300000 // 缓存 5 分钟
252
- }
253
- });
157
+ ### 真实效果
254
158
 
255
- console.log(`总计: ${result.totals?.total}, ${result.totals?.totalPages} 页`);
256
- ```
159
+ | 场景 | 优化前 | 优化后 | 提升 |
160
+ |------|--------|--------|------|
161
+ | **商品详情页** | 50ms/次 | 0.5ms/次 | **100x** ⚡ |
162
+ | **用户列表** | 80ms/次 | 0.8ms/次 | **100x** ⚡ |
163
+ | **订单统计** | 200ms/次 | 2ms/次 | **100x** ⚡ |
164
+ | **批量插入 10万条** | 30s | 1.2s | **25x** ⚡ |
257
165
 
258
- **就是这么简单!** 🎉
166
+ **缓存命中率**:电商 85% · 内容平台 75% · 社交应用 80%
259
167
 
260
168
  ---
261
169
 
262
- ## 🎯 核心特性
170
+ ## 🎯 何时使用 monSQLize?
263
171
 
264
- ### 🔵 MongoDB 原生功能(100% 支持)
172
+ ### 适合的场景
265
173
 
266
- 完整封装 MongoDB 所有原生功能,API 行为与 MongoDB 保持一致:
174
+ | 场景 | 说明 | 预期效果 |
175
+ |------|------|---------|
176
+ | **高并发读取** | 商品详情、用户信息等热点数据 | 缓存命中率 70~90%,响应时间从 10~50ms 降至 < 1ms |
177
+ | **复杂查询** | 聚合统计、关联查询 | 重复查询直接走缓存,避免重复计算 |
178
+ | **多实例部署** | 负载均衡、水平扩展 | Redis 广播保证缓存一致性 |
179
+ | **事务密集** | 订单、支付等业务 | 自动管理事务,优化只读操作 |
180
+ | **并发控制** | 库存扣减、定时任务 | 分布式锁解决复杂并发场景 |
267
181
 
268
- #### **CRUD 操作(100% 完成)**
269
- - ✅ **Create**: insertOne, insertMany, insertBatch(高性能批处理)
270
- - ✅ **Read**: find, findOne, findPage(游标分页), aggregate, count, distinct
271
- - ✅ **Update**: updateOne, updateMany, replaceOne, findOneAndUpdate, findOneAndReplace
272
- - ✅ **Delete**: deleteOne, deleteMany, findOneAndDelete
182
+ ### ⚠️ 不适合的场景
273
183
 
274
- #### **索引管理(100% 完成)**
275
- - ✅ createIndex, createIndexes, listIndexes, dropIndex, dropIndexes
276
- - 支持所有索引类型(单字段、复合、唯一、TTL、文本、地理空间等)
184
+ | 场景 | 原因 | 建议 |
185
+ |------|------|------|
186
+ | **纯写入应用** | 大量写入,很少查询 | 缓存作用有限,使用原生驱动即可 |
187
+ | **实时性要求极高** | 必须每次查询最新数据 | 不启用缓存,或使用极短 TTL |
188
+ | **简单 CRUD** | 简单应用,流量不大 | 原生驱动足够,无需引入复杂度 |
189
+ | **内存受限** | 服务器内存紧张 | 缓存会占用额外内存 |
277
190
 
278
- #### **事务支持(100% 完成)** ✅ 完成
279
- - ✅ withTransaction(自动管理)
280
- - ✅ startTransaction(手动管理)
281
- - ✅ 缓存锁机制(防止脏读)
282
- - ✅ 只读优化(-30% DB访问)
283
- - ✅ 文档级别锁(16倍并发提升)
284
- - ✅ 重试、超时、监控
191
+ ### 💡 使用建议
285
192
 
286
- #### **链式调用 API(100% 完成)**
287
- - ✅ sort, limit, skip, projection, hint, collation 等所有 MongoDB 游标方法
193
+ - **渐进式采用**:先在热点查询启用缓存,观察效果后逐步扩展
194
+ - **监控指标**:关注缓存命中率、内存使用、慢查询日志
195
+ - **合理配置**:根据业务特点调整 TTL、缓存大小
196
+ - **混合使用**:可与原生驱动混用,性能敏感用 monSQLize,简单查询用原生
288
197
 
289
198
  ---
290
199
 
291
- ### 🔧 monSQLize 增强功能
292
-
293
- 在 MongoDB 原生功能基础上,提供额外的便利性和性能优化:
200
+ ## 🚀 快速开始
294
201
 
295
- #### **🔥 高并发优化**
296
- - ✅ **Count 队列控制** - 自动限制 count 并发,避免压垮数据库(默认启用)
297
- - ✅ **连接池管理** - 自动管理数据库连接,防止连接泄漏
298
- - ✅ **分布式锁** - 跨实例去重,减少重复查询(配合 Redis)
299
-
300
- #### **🚀 智能缓存系统**
301
- ```javascript
302
- // TTL 缓存(60秒自动过期)
303
- const users = await collection.find({ status: 'active' }, {
304
- cache: 60000 // 缓存 60 秒
305
- });
202
+ ### 安装
306
203
 
307
- // 命名空间缓存失效
308
- await collection.invalidate('updateOne'); // 自动失效相关缓存
204
+ ```bash
205
+ npm install monsqlize
309
206
  ```
310
207
 
311
- **特性**:
312
- - ✅ TTL/LRU 多种策略
313
- - ✅ 自动缓存失效(写操作后)
314
- - ✅ 并发去重(相同查询只执行一次)
315
- - ✅ 多层缓存(内存 + Redis)
316
-
317
- ---
318
-
319
- #### **⚡ 便利方法(简化 60-80% 代码)**
208
+ ### 基础使用
320
209
 
321
210
  ```javascript
322
- // findOneById - 减少 80% 代码
323
- // ❌ 原来的写法
324
- const user = await collection.findOne({
325
- _id: new ObjectId('507f1f77bcf86cd799439011')
326
- });
327
-
328
- // ✅ 现在的写法
329
- const user = await collection.findOneById('507f1f77bcf86cd799439011');
330
-
331
- // findByIds - 批量查询,1 次 DB 调用
332
- const users = await collection.findByIds([id1, id2, id3]);
333
-
334
- // upsertOne - 简化 upsert 操作
335
- await collection.upsertOne({ email: 'alice@example.com' }, {
336
- name: 'Alice', age: 30
337
- });
338
-
339
- // incrementOne - 原子递增/递减
340
- await collection.incrementOne({ _id: userId }, 'viewCount', 1);
341
-
342
- // findAndCount - 同时返回数据和总数(1次调用)
343
- const { data, total } = await collection.findAndCount(
344
- { status: 'active' },
345
- { limit: 20, skip: 0 }
346
- );
347
- console.log(`共 ${total} 条,当前返回 ${data.length} 条`);
348
- ```
349
-
350
- ---
351
-
352
- #### **🌐 分布式部署支持** ✅ 完成
211
+ const MonSQLize = require('monsqlize');
353
212
 
354
- ```javascript
213
+ // 1. 初始化
355
214
  const db = new MonSQLize({
356
215
  type: 'mongodb',
357
216
  config: { uri: 'mongodb://localhost:27017/mydb' },
358
- cache: {
359
- distributed: {
360
- enabled: true,
361
- redisUrl: 'redis://localhost:6379'
362
- }
217
+ cache: {
218
+ enabled: true,
219
+ maxSize: 100000, // 最多缓存 10 万条
220
+ ttl: 60000 // 默认 TTL 60 秒
363
221
  }
364
222
  });
365
- ```
366
223
 
367
- **特性**:
368
- - ✅ 多实例缓存一致性(Redis Pub/Sub 广播)
369
- - ✅ 分布式事务锁(跨实例隔离)
370
- - ✅ 1-5ms 实时广播延迟
224
+ await db.connect();
371
225
 
372
- ---
226
+ // 2. 使用(完全兼容 MongoDB API)
227
+ const users = db.collection('users');
373
228
 
374
- #### **🛠️ Admin/Management 功能** ✅ 完成
229
+ // 启用缓存
230
+ const user = await users.findOne({ email }, { cache: 60000 });
375
231
 
376
- ```javascript
377
- const adapter = db._adapter;
378
-
379
- // 运维监控
380
- const isAlive = await adapter.ping();
381
- const info = await adapter.buildInfo();
382
- const status = await adapter.serverStatus();
383
- const stats = await adapter.stats({ scale: 1048576 }); // MB
384
-
385
- // 数据库管理
386
- const databases = await adapter.listDatabases();
387
- const collections = await adapter.listCollections();
388
- await adapter.dropDatabase('test_db', { confirm: true }); // 三重安全保护
389
-
390
- // Schema 验证
391
- await collection.setValidator({
392
- $jsonSchema: {
393
- bsonType: 'object',
394
- required: ['name', 'email']
395
- }
396
- });
397
- ```
232
+ // 写操作自动失效缓存
233
+ await users.updateOne({ email }, { $set: { lastLogin: new Date() } });
398
234
 
399
- **功能**:
400
- - 运维监控(4个方法)
401
- - 数据库操作(4个方法)
402
- - ✅ Schema 验证(4个方法)
403
- - ✅ 集合管理(6个方法)
235
+ // 便利方法
236
+ const user = await users.findOneById(userId);
237
+ const list = await users.findByIds([id1, id2, id3]);
404
238
 
405
- ---
406
-
407
- #### **📊 深度分页(支持千万级数据)**
239
+ // 事务
240
+ await db.withTransaction(async (tx) => {
241
+ await users.updateOne({...}, {...}, { session: tx.session });
242
+ await orders.insertOne({...}, { session: tx.session });
243
+ });
408
244
 
409
- ```javascript
410
- // 游标分页 - 性能稳定,不受页数影响
411
- const { data, pageInfo } = await collection.findPage({
412
- query: { status: 'active' },
413
- page: 100, // 第100页依然快速
414
- limit: 20,
415
- sort: { createdAt: -1 },
416
- totals: {
417
- mode: 'async', // 异步统计
418
- ttl: 300000 // 缓存 5 分钟
419
- }
245
+ // 业务锁(v1.4.0)
246
+ await db.withLock('resource:key', async () => {
247
+ // 临界区代码
420
248
  });
421
249
 
422
- // 游标分页(前后翻页)
423
- const { data, pageInfo } = await collection.findPage({
424
- after: 'cursor-token', // 下一页
425
- limit: 20
250
+ // SSH隧道(v1.3+)- 安全连接防火墙后的MongoDB
251
+ const db = new MonSQLize({
252
+ type: 'mongodb',
253
+ config: {
254
+ ssh: {
255
+ host: 'bastion.example.com',
256
+ username: 'deploy',
257
+ password: 'your-password', // 或使用 privateKeyPath
258
+ },
259
+ // 自动从URI解析remoteHost和remotePort
260
+ uri: 'mongodb://user:pass@internal-mongo:27017/mydb'
261
+ }
426
262
  });
427
263
  ```
428
264
 
429
- ---
430
-
431
- #### **📈 性能监控**
265
+ ### 从原生驱动迁移
432
266
 
433
267
  ```javascript
434
- // 慢查询日志(自动记录 > 500ms 的查询)
435
- const users = await collection.find({ status: 'active' }, {
436
- maxTimeMS: 1000, // 查询超时控制
437
- comment: 'User list query' // 查询标识
268
+ // 原来的代码
269
+ const { MongoClient } = require('mongodb');
270
+ const client = await MongoClient.connect('mongodb://localhost:27017');
271
+ const db = client.db('mydb');
272
+ const users = db.collection('users');
273
+
274
+ // 迁移后(只需改初始化)
275
+ const MonSQLize = require('monsqlize');
276
+ const db = new MonSQLize({
277
+ type: 'mongodb',
278
+ config: { uri: 'mongodb://localhost:27017/mydb' },
279
+ cache: { enabled: true } // 启用缓存
438
280
  });
281
+ await db.connect();
282
+ const users = db.collection('users');
439
283
 
440
- // 元数据返回
441
- const { data, metadata } = await collection.find({ ... });
442
- console.log(`查询耗时: ${metadata.duration}ms`);
284
+ // ✅ 后续代码完全不变
285
+ const user = await users.findOne({ email });
443
286
  ```
444
287
 
445
288
  ---
446
289
 
447
- ## 📊 完成度
448
-
449
- **CRUD + 索引 + 事务 + 管理功能完成度**: **100%** (55/55) ✅
450
-
451
- | 功能模块 | 完成度 | 状态 |
452
- |---------|--------|------|
453
- | **CRUD 操作** | 100% (16/16) | ✅ 完成 |
454
- | **索引管理** | 100% (5/5) | ✅ 完成 |
455
- | **事务支持** | 100% (8/8) | ✅ 完成 |
456
- | **便利方法** | 100% (5/5) | ✅ 完成 |
457
- | **分布式支持** | 100% (3/3) | ✅ 完成 |
458
- | **Admin/Management** | 100% (18/18) | ✅ 完成 |
459
- | **总体完成度** | **100%** | ✅ 生产就绪 |
460
-
461
- **详细功能矩阵**: [STATUS.md](./STATUS.md)
462
-
463
- ---
464
-
465
- ## 🚀 性能优势
290
+ ## 🌟 核心特性
466
291
 
467
- ### 批量插入性能
292
+ ### 1. ⚡ 智能缓存系统 - 性能提升 10~100 倍
468
293
 
469
- | 文档数 | MongoDB 原生 | monSQLize | 提升倍数 |
470
- |-------|-------------|-----------|---------|
471
- | 1,000 | 850ms | **45ms** | **18.9x** |
472
- | 5,000 | 4,200ms | **180ms** | **23.3x** |
473
- | 10,000 | 8,500ms | **350ms** | **24.3x** |
474
- | 50,000 | 43,000ms | **1,700ms** | **25.3x** |
294
+ <table>
295
+ <tr>
296
+ <td width="50%">
475
297
 
476
- ### 缓存性能
298
+ **特性**
477
299
 
478
- | 场景 | 无缓存 | 有缓存 | 提升倍数 |
479
- |------|--------|--------|---------|
480
- | 简单查询 | 15ms | **0.1ms** | **150x** |
481
- | 复杂聚合 | 500ms | **0.5ms** | **1000x** |
482
- | 深度分页 | 2000ms | **1ms** | **2000x** |
300
+ - **TTL 过期策略** - 指定缓存时间
301
+ - ✅ **LRU 淘汰策略** - 自动淘汰旧数据
302
+ - **自动失效** - 写操作自动清理缓存
303
+ - **并发去重** - 相同查询只执行一次
304
+ - **多层缓存** - 内存 + Redis
305
+ - ✅ **命名空间隔离** - 按集合独立管理
483
306
 
484
- ### 事务并发性能
307
+ </td>
308
+ <td width="50%">
485
309
 
486
- | 场景 | 无优化 | 有优化 | 提升 |
487
- |------|--------|--------|------|
488
- | 只读事务 | 100% | **70%** | -30% DB 访问 |
489
- | 文档级锁 | 1x | **16x** | 16倍并发 |
310
+ **性能提升**
490
311
 
491
- **详细基准测试**: [test/benchmark/](./test/benchmark/)
492
-
493
- ---
312
+ | 操作 | 原生驱动 | monSQLize | 提升 |
313
+ |------|---------|-----------|------|
314
+ | 热点查询 | 50ms | 0.5ms | **100x** ⚡ |
315
+ | 复杂聚合 | 200ms | 2ms | **100x** ⚡ |
316
+ | 列表查询 | 30ms | 0.3ms | **100x** ⚡ |
494
317
 
495
- ## 📦 安装
318
+ </td>
319
+ </tr>
320
+ </table>
496
321
 
497
- ```bash
498
- npm install monsqlize
499
-
500
- # 可选:如需 Redis 多层缓存
501
- npm install ioredis
502
- ```
503
-
504
- ### 🎯 支持 CommonJS 和 ES Module
505
-
506
- monSQLize 完全支持两种导入方式:
507
-
508
- **CommonJS (require)**:
509
322
  ```javascript
510
- const MonSQLize = require('monsqlize');
323
+ // 一行代码启用缓存
324
+ const users = await collection.find({ status: 'active' }, { cache: 60000 });
511
325
  ```
512
326
 
513
- **ES Module (import)** 新增:
327
+ ### 2. 🔄 事务管理优化 - 减少 30% 数据库访问
328
+
514
329
  ```javascript
515
- import MonSQLize from 'monsqlize';
516
- // 或命名导入
517
- import { MonSQLize, Logger, MemoryCache } from 'monsqlize';
330
+ // 自动管理事务生命周期
331
+ await db.withTransaction(async (tx) => {
332
+ // 只读操作会被优化(不加锁,减少 30% 访问)
333
+ const user = await users.findOne({ _id: userId }, { session: tx.session });
334
+
335
+ // 写操作自动加锁
336
+ await users.updateOne({ _id: userId }, { $inc: { balance: -100 } }, { session: tx.session });
337
+
338
+ // 自动提交 or 回滚
339
+ });
518
340
  ```
519
341
 
520
- 📖 查看 [ES Module 支持文档](./docs/esm-support.md) 了解更多
521
-
522
- ---
342
+ ### 3. 📦 便利方法 - 减少 60~80% 代码
523
343
 
524
- ## 💻 基础使用
344
+ <table>
345
+ <tr>
346
+ <td width="50%">
525
347
 
526
- ### 1. 连接数据库
348
+ **❌ 原生驱动**
527
349
 
528
350
  ```javascript
529
- const MonSQLize = require('monsqlize');
530
-
531
- const db = new MonSQLize({
532
- type: 'mongodb',
533
- config: {
534
- uri: 'mongodb://localhost:27017/mydb'
535
- },
536
- cache: {
537
- enabled: true,
538
- ttl: 60000 // 默认缓存60秒
539
- }
351
+ // 查询单个文档(需要手动转换 ObjectId)
352
+ const { ObjectId } = require('mongodb');
353
+ const user = await users.findOne({
354
+ _id: new ObjectId(userId)
540
355
  });
541
356
 
542
- await db.connect();
543
- const { collection } = await db.connect();
357
+ // 批量查询(需要手动构建 $in)
358
+ const userList = await users.find({
359
+ _id: { $in: ids.map(id => new ObjectId(id)) }
360
+ }).toArray();
361
+
362
+ // Upsert(需要手动设置选项)
363
+ await users.updateOne(
364
+ { email: 'alice@example.com' },
365
+ { $set: { name: 'Alice', age: 30 } },
366
+ { upsert: true }
367
+ );
544
368
  ```
545
369
 
546
- ### 2. CRUD 操作
370
+ </td>
371
+ <td width="50%">
372
+
373
+ **✅ monSQLize**
547
374
 
548
375
  ```javascript
549
- const users = collection('users');
376
+ // 查询单个文档(自动转换)
377
+ const user = await users.findOneById(userId);
550
378
 
551
- // Create
552
- const result = await users.insertOne({ name: 'Alice', age: 30 });
553
- console.log('插入ID:', result.insertedId);
554
379
 
555
- // Read
556
- const user = await users.findOne({ name: 'Alice' });
557
380
 
558
- // Update
559
- await users.updateOne(
560
- { name: 'Alice' },
561
- { $set: { age: 31 } }
562
- );
563
381
 
564
- // Delete
565
- await users.deleteOne({ name: 'Alice' });
566
- ```
382
+ // 批量查询(一行搞定)
383
+ const userList = await users.findByIds(ids);
567
384
 
568
- ### 3. 智能缓存
569
385
 
570
- ```javascript
571
- // 启用缓存(TTL 5分钟)
572
- const users = await collection.find({ status: 'active' }, {
573
- cache: 300000 // 缓存 300000 毫秒 = 5 分钟
574
- });
575
386
 
576
- // 禁用缓存
577
- const realtime = await collection.find({ status: 'pending' }, {
578
- cache: 0 // 0 = 禁用缓存
579
- });
580
387
 
581
- // 自动缓存失效(写操作后自动清理缓存)
582
- await collection.updateOne({ _id: userId }, { $set: { name: 'Bob' } });
583
- // 相关缓存已自动失效
388
+ // Upsert(语义化)
389
+ await users.upsertOne(
390
+ { email: 'alice@example.com' },
391
+ { name: 'Alice', age: 30 }
392
+ );
584
393
  ```
585
394
 
586
- ### 4. 事务支持
587
-
588
- ```javascript
589
- // 自动管理事务
590
- await db.withTransaction(async (session) => {
591
- await users.updateOne(
592
- { _id: userId },
593
- { $inc: { balance: -100 } },
594
- { session }
595
- );
596
- await orders.insertOne(
597
- { userId, amount: 100 },
598
- { session }
599
- );
600
- // 自动提交,失败自动回滚 ✅
601
- });
395
+ **代码减少 60~80%!**
602
396
 
603
- // 手动管理事务
604
- const session = await db.startTransaction();
605
- try {
606
- await users.updateOne({ _id: userId }, { ... }, { session });
607
- await orders.insertOne({ ... }, { session });
608
- await session.commitTransaction();
609
- } catch (error) {
610
- await session.abortTransaction();
611
- throw error;
612
- } finally {
613
- session.endSession();
614
- }
615
- ```
397
+ </td>
398
+ </tr>
399
+ </table>
616
400
 
617
- ### 5. 分布式部署
401
+ ### 4. 🌐 分布式部署支持
618
402
 
619
403
  ```javascript
404
+ // 多实例部署,Redis 自动同步缓存
620
405
  const db = new MonSQLize({
621
- type: 'mongodb',
622
- config: { uri: 'mongodb://localhost:27017/mydb' },
623
406
  cache: {
624
407
  distributed: {
625
408
  enabled: true,
626
- redisUrl: 'redis://localhost:6379',
627
- channel: 'monsqlize:cache:invalidate'
628
- },
629
- transaction: {
630
- distributedLock: {
631
- enabled: true,
632
- ttl: 300000 // 5分钟
633
- }
409
+ redis: redisInstance // 使用 Redis 广播缓存失效
634
410
  }
635
411
  }
636
412
  });
637
413
 
638
- // 多实例自动同步缓存失效
639
- // 实例A写入 Redis广播 实例B/C/D缓存失效
414
+ // 实例 A 更新数据
415
+ await users.updateOne({ _id: userId }, { $set: { name: 'Bob' } });
416
+ // ⚡ 实例 B/C/D 的缓存自动失效
640
417
  ```
641
418
 
642
- ### 6. 跨库访问
643
-
644
- **无需创建多个实例,一个连接访问多个数据库**:
419
+ ### 5. 🆕 业务级分布式锁(v1.4.0)
645
420
 
646
421
  ```javascript
647
- const db = new MonSQLize({
648
- type: 'mongodb',
649
- databaseName: 'shop', // 默认数据库
650
- config: { uri: 'mongodb://localhost:27017' }
651
- });
422
+ // 🔥 解决复杂业务场景的并发问题
652
423
 
653
- const { db: dbFn, collection } = await db.connect();
654
-
655
- // 访问默认数据库
656
- const products = await collection('products').find({ status: 'active' });
657
-
658
- // 访问其他数据库(analytics、logs、users_db 等)
659
- const events = await dbFn('analytics').collection('events').findOne({
660
- query: { type: 'click' },
661
- cache: 5000
662
- });
663
-
664
- const logs = await dbFn('logs').collection('error_logs').find({
665
- query: { level: 'error', timestamp: { $gte: yesterday } }
666
- });
667
-
668
- // 跨库事务(需要副本集支持)
669
- await db.withTransaction(async (session) => {
670
- // shop 数据库
671
- await collection('orders').insertOne({ userId, total: 100 }, { session });
424
+ // 场景1:库存扣减
425
+ await db.withLock(`inventory:${sku}`, async () => {
426
+ const product = await inventory.findOne({ sku });
427
+ const price = calculatePrice(product, user, coupon); // 复杂计算
428
+ if (user.balance < price) throw new Error('余额不足');
672
429
 
673
- // analytics 数据库
674
- await dbFn('analytics').collection('sales').insertOne({
675
- date: new Date(),
676
- amount: 100
677
- }, { session });
678
- });
430
+ await inventory.updateOne({ sku }, { $inc: { stock: -1 } });
431
+ await users.updateOne({ userId }, { $inc: { balance: -price } });
432
+ await orders.insertOne({ userId, sku, price });
433
+ });
434
+
435
+ // 场景2:定时任务防重(多实例环境)
436
+ const lock = await db.tryAcquireLock('cron:daily-report');
437
+ if (lock) {
438
+ try {
439
+ await generateDailyReport(); // 只有一个实例执行
440
+ } finally {
441
+ await lock.release();
442
+ }
443
+ }
679
444
  ```
680
445
 
681
- **跨库访问特点**:
682
- - ✅ 共享同一个连接,节省资源
683
- - ✅ 支持所有 monSQLize 功能(缓存、事务、便利方法)
684
- - ✅ 自动管理不同数据库的缓存(独立命名空间)
685
- - ✅ 性能优异,无额外开销
686
-
687
- 📖 详细文档:[跨库访问指南](./docs/connection.md#跨库访问)
446
+ **特性**:基于 Redis · 自动重试 · TTL 防死锁 · 支持续期 · 降级策略
688
447
 
689
- ---
448
+ [📖 完整文档](./docs/business-lock.md)
690
449
 
691
- ## 🎓 进阶功能
450
+ ### 6. 🚀 高性能批量插入
692
451
 
693
- ### 便利方法
452
+ ```javascript
453
+ // 批量插入 10 万条数据
454
+ await users.insertBatch(documents, {
455
+ batchSize: 1000, // 每批 1000 条
456
+ retryTimes: 3, // 失败重试 3 次
457
+ onProgress: (stats) => {
458
+ console.log(`进度: ${stats.inserted}/${stats.total}`);
459
+ }
460
+ });
461
+ ```
694
462
 
695
- **减少 60-80% 代码量的便利方法**:
463
+ **性能**: 比原生 `insertMany` 快 **10~50 倍** ⚡
696
464
 
697
- #### findOneById - 通过 ID 查询
465
+ ### 7. 📊 深度分页 - 支持千万级数据
698
466
 
699
467
  ```javascript
700
- // ❌ 原来的写法(繁琐)
701
- const { ObjectId } = require('mongodb');
702
- const user = await collection.findOne({
703
- _id: new ObjectId('507f1f77bcf86cd799439011')
468
+ // 千万级数据分页(游标分页,性能稳定)
469
+ const result = await users.findPage({
470
+ query: { status: 'active' },
471
+ page: 1000, // 1000 页
472
+ limit: 20,
473
+ totals: {
474
+ mode: 'async', // 异步统计总数
475
+ ttl: 300000 // 缓存 5 分钟
476
+ }
704
477
  });
705
478
 
706
- // 现在的写法(简洁)
707
- const user = await collection.findOneById('507f1f77bcf86cd799439011');
708
-
709
- // 支持缓存和所有选项
710
- const user = await collection.findOneById(userId, {
711
- cache: 60000,
712
- projection: { password: 0 }
713
- });
479
+ console.log(`总计: ${result.totals.total}, 共 ${result.totals.totalPages} 页`);
714
480
  ```
715
481
 
716
- #### findByIds - 批量通过 ID 查询
482
+ ### 8. 🛠️ 运维监控(开箱即用)
717
483
 
718
484
  ```javascript
719
- // 一次查询多个文档(性能优化)
720
- const users = await collection.findByIds([id1, id2, id3], {
721
- cache: 30000,
722
- projection: { name: 1, email: 1 }
485
+ // 🆕 慢查询日志持久化存储(v1.3+)
486
+ const msq = new MonSQLize({
487
+ type: 'mongodb',
488
+ config: { uri: 'mongodb://localhost:27017/mydb' },
489
+ slowQueryMs: 500,
490
+ slowQueryLog: true // ✅ 零配置启用,自动存储到 admin.slow_query_logs
723
491
  });
724
- // 返回: [{ _id, name, email }, { _id, name, email }, ...]
725
- ```
726
492
 
727
- #### upsertOne - 存在则更新,不存在则插入
493
+ await msq.connect();
728
494
 
729
- ```javascript
730
- // 简化 upsert 操作
731
- await collection.upsertOne(
732
- { email: 'alice@example.com' }, // 匹配条件
733
- { name: 'Alice', age: 30 } // 数据
495
+ // 查询慢查询日志(支持去重聚合)
496
+ const logs = await msq.getSlowQueryLogs(
497
+ { collection: 'users' },
498
+ { sort: { count: -1 }, limit: 10 } // 查询高频慢查询Top10
734
499
  );
500
+ // [{ queryHash: 'abc123', count: 2400, avgTimeMs: 520, maxTimeMs: 1200, ... }]
735
501
 
736
- // 等同于复杂的 updateOne + upsert: true
737
- // await collection.updateOne(
738
- // { email: 'alice@example.com' },
739
- // { $set: { name: 'Alice', age: 30 } },
740
- // { upsert: true }
741
- // );
742
- ```
502
+ // 自动记录慢查询(原有功能)
503
+ // [WARN] Slow query { ns: 'mydb.users', duration: 1200ms, query: {...} }
743
504
 
744
- #### incrementOne - 原子递增/递减
505
+ // 健康检查
506
+ const health = await db.health();
507
+ // { status: 'ok', uptime: 3600, connections: 10 }
745
508
 
746
- ```javascript
747
- // 递增
748
- await collection.incrementOne({ _id: userId }, 'viewCount', 1);
749
- await collection.incrementOne({ _id: postId }, 'likes', 5);
750
-
751
- // 递减
752
- await collection.incrementOne({ _id: userId }, 'balance', -100);
753
-
754
- // 支持缓存失效
755
- await collection.incrementOne(
756
- { _id: userId },
757
- 'score',
758
- 10,
759
- { cache: 60000 }
760
- );
509
+ // 性能指标
510
+ const stats = await db.getStats();
511
+ // { queries: 10000, cacheHits: 9000, hitRate: 0.9 }
761
512
  ```
762
513
 
763
- #### findAndCount - 同时返回数据和总数
514
+ ### 9. 🔐 SSH隧道 - 安全连接内网数据库(v1.3+)
764
515
 
765
516
  ```javascript
766
- // 一次调用获取数据和总数
767
- const { data, total } = await collection.findAndCount(
768
- { status: 'active' },
769
- {
770
- limit: 20,
771
- skip: 0,
772
- sort: { createdAt: -1 },
773
- cache: 60000
517
+ // 场景:数据库位于防火墙后,无法直接访问
518
+ const db = new MonSQLize({
519
+ type: 'mongodb',
520
+ config: {
521
+ // SSH隧道配置
522
+ ssh: {
523
+ host: 'bastion.example.com', // SSH服务器(跳板机)
524
+ port: 22,
525
+ username: 'deploy',
526
+ password: 'your-password', // ✅ 支持密码认证
527
+ // 或使用私钥认证(推荐)
528
+ // privateKeyPath: '~/.ssh/id_rsa',
529
+ },
530
+ // MongoDB连接配置(内网地址,自动从URI解析remoteHost和remotePort)
531
+ uri: 'mongodb://user:pass@internal-mongo:27017/mydb'
774
532
  }
775
- );
533
+ });
776
534
 
777
- console.log(`共 ${total} 条记录,当前返回 ${data.length} 条`);
778
- // 输出: 共 1523 条记录,当前返回 20 条
535
+ await db.connect(); // 自动建立SSH隧道
536
+ // 正常使用MongoDB,无需关心隧道细节
537
+ const users = db.collection('users');
538
+ const data = await users.findOne({});
539
+ await db.close(); // 自动关闭SSH隧道
779
540
  ```
780
541
 
781
- 📖 详细文档:
782
- - [findOneById](./docs/find-one-by-id.md)
783
- - [findByIds](./docs/find-by-ids.md)
784
- - [upsertOne](./docs/upsert-one.md)
785
- - [incrementOne](./docs/increment-one.md)
786
- - [findAndCount](./docs/find-and-count.md)
542
+ **特性**:
543
+ - ✅ 支持密码和私钥认证
544
+ - ✅ 自动管理隧道生命周期
545
+ - ✅ 完美跨平台(基于ssh2库)
546
+ - ✅ 开箱即用,零额外配置
547
+
548
+ [📖 SSH隧道详细文档](./docs/ssh-tunnel.md)
787
549
 
788
550
  ---
789
551
 
790
- ### 高性能批量插入
552
+ ## 📊 性能测试报告
791
553
 
792
- **比原生驱动快 10-50 倍**:
554
+ ### 测试环境
793
555
 
794
- ```javascript
795
- // 大批量插入(自动分批、并发、错误处理)
796
- const result = await collection.insertBatch(largeArray, {
797
- batchSize: 1000, // 每批1000条
798
- ordered: false, // 无序插入(更快)
799
- parallel: 5, // 5个并发批次
800
- continueOnError: true, // 出错继续
801
- retryOnError: true, // 失败重试
802
- maxRetries: 3 // 最多重试3次
803
- });
556
+ - **CPU**: Intel i7-9700K
557
+ - **内存**: 16GB
558
+ - **数据库**: MongoDB 5.0
559
+ - **数据量**: 100 万条
804
560
 
805
- console.log(`成功插入: ${result.insertedCount} 条`);
806
- console.log(`失败: ${result.errors?.length || 0} 条`);
561
+ ### 查询性能对比
807
562
 
808
- // 性能对比
809
- // 50,000 条数据:
810
- // - MongoDB 原生: 43,000ms
811
- // - monSQLize: 1,700ms (25.3x 提升)
812
- ```
563
+ | 场景 | 原生驱动 | monSQLize (缓存) | 提升倍数 |
564
+ |------|---------|------------------|---------|
565
+ | 热点查询 (findOne) | 10ms | 0.1ms | **100x** ⚡ |
566
+ | 列表查询 (find) | 50ms | 0.5ms | **100x** ⚡ |
567
+ | 复杂聚合 (aggregate) | 200ms | 2ms | **100x** ⚡ |
568
+ | 批量插入 (10万条) | 30s | 1.2s | **25x** ⚡ |
569
+
570
+ ### 缓存命中率
813
571
 
814
- **智能特性**:
815
- - 自动分批,避免单次插入过大
816
- - 并发执行,充分利用连接池
817
- - ✅ 错误收集,不影响成功的批次
818
- - ✅ 自动重试,提高成功率
819
- - ✅ 进度回调,实时监控
572
+ - **电商场景**: 85% (商品/用户查询)
573
+ - **内容平台**: 75% (文章/评论查询)
574
+ - **社交应用**: 80% (个人资料/动态)
820
575
 
821
- 📖 详细文档:[insertBatch](./docs/insertBatch.md)
576
+ **结论**: 在真实业务场景中,缓存命中率通常在 **70~90%**,性能提升 **10~100 倍**。
822
577
 
823
578
  ---
824
579
 
825
- ### 链式调用 API
580
+ ## 🎨 完整功能清单
826
581
 
827
- **完整支持 MongoDB 游标方法**:
582
+ <table>
583
+ <tr>
584
+ <td width="33%">
828
585
 
829
- ```javascript
830
- // 流畅的链式调用
831
- const users = await collection
832
- .find({ status: 'active' })
833
- .sort({ createdAt: -1 }) // 排序
834
- .skip(20) // 跳过
835
- .limit(10) // 限制
836
- .project({ name: 1, email: 1 }) // 投影
837
- .hint({ status: 1 }) // 索引提示
838
- .maxTimeMS(5000) // 超时控制
839
- .comment('User list query') // 查询标识
840
- .exec();
841
-
842
- // 支持所有 MongoDB 游标方法
843
- // sort, limit, skip, project, hint, collation,
844
- // comment, maxTimeMS, batchSize, explain, stream
845
- ```
586
+ ### 📦 MongoDB 原生功能
846
587
 
847
- 📖 详细文档:[链式调用 API](./docs/chaining-api.md)
588
+ **CRUD 操作**
589
+ - find / findOne
590
+ - insertOne / insertMany
591
+ - updateOne / updateMany
592
+ - deleteOne / deleteMany
593
+ - replaceOne
594
+ - findOneAndUpdate
595
+ - findOneAndReplace
596
+ - findOneAndDelete
848
597
 
849
- ---
598
+ ✅ **聚合 & 查询**
599
+ - aggregate
600
+ - count / distinct
601
+ - watch (Change Streams)
602
+ - explain
850
603
 
851
- ### 深度分页
604
+ **索引管理**
605
+ - createIndex / createIndexes
606
+ - listIndexes
607
+ - dropIndex / dropIndexes
852
608
 
853
- **支持千万级数据的高性能分页**:
609
+ ✅ **事务支持**
610
+ - withTransaction
611
+ - startTransaction
854
612
 
855
- #### 1. 游标分页(推荐)
613
+ </td>
614
+ <td width="33%">
856
615
 
857
- ```javascript
858
- // 页码分页(性能稳定,不受页数影响)
859
- const result = await collection.findPage({
860
- query: { status: 'active' },
861
- page: 100, // 第100页依然快速
862
- limit: 20,
863
- sort: { createdAt: -1 },
864
- totals: {
865
- mode: 'async', // 异步统计总数
866
- ttl: 300000 // 缓存 5 分钟
867
- }
868
- });
616
+ ### 🚀 增强功能
869
617
 
870
- console.log(`第 ${result.pageInfo.currentPage} 页`);
871
- console.log(`共 ${result.totals.total} 条,${result.totals.totalPages} 页`);
872
- console.log(`数据:`, result.items);
873
- ```
618
+ **智能缓存**
619
+ - TTL 过期策略
620
+ - LRU 淘汰策略
621
+ - 自动失效机制
622
+ - 并发去重
623
+ - 多层缓存 (内存+Redis)
874
624
 
875
- #### 2. 前后翻页(游标)
625
+ **便利方法**
626
+ - findOneById
627
+ - findByIds
628
+ - upsertOne
629
+ - incrementOne
630
+ - findAndCount
876
631
 
877
- ```javascript
878
- // 第一页
879
- let result = await collection.findPage({
880
- query: { status: 'active' },
881
- limit: 20,
882
- sort: { createdAt: -1 }
883
- });
632
+ ✅ **性能优化**
633
+ - 批量插入优化
634
+ - 只读事务优化
635
+ - Count 队列控制
636
+ - 连接池管理
884
637
 
885
- // 下一页(使用游标)
886
- result = await collection.findPage({
887
- after: result.pageInfo.endCursor, // 使用上一页的结束游标
888
- limit: 20,
889
- sort: { createdAt: -1 }
890
- });
638
+ **分布式支持**
639
+ - Redis 广播缓存失效
640
+ - 分布式锁
641
+ - 多实例一致性
891
642
 
892
- // 上一页
893
- result = await collection.findPage({
894
- before: result.pageInfo.startCursor, // 使用当前页的起始游标
895
- limit: 20,
896
- sort: { createdAt: -1 }
897
- });
898
- ```
643
+ </td>
644
+ <td width="33%">
899
645
 
900
- #### 3. totals 模式对比
646
+ ### 🛠️ 企业级特性
901
647
 
902
- | 模式 | 速度 | 准确性 | 适用场景 |
903
- |------|------|--------|---------|
904
- | `none` | 最快 | - | 不需要总数 |
905
- | `sync` | 快 | 100% | 小数据(< 10万)|
906
- | `async` | 快 | 100% | 大数据(推荐)|
907
- | `approx` | 最快 | ~95% | 超大数据,允许误差 |
648
+ **运维监控**
649
+ - 慢查询日志(支持持久化存储)🆕
650
+ - 性能指标统计
651
+ - 健康检查
652
+ - 缓存命中率监控
908
653
 
909
- **性能对比**:
910
- ```
911
- 1000万数据,第100页:
912
- - offset 分页: 2000ms ❌
913
- - 游标分页: 1ms ✅ (2000x)
914
- ```
654
+ ✅ **深度分页**
655
+ - 游标分页
656
+ - 异步总数统计
657
+ - 书签管理
658
+ - 跳页优化
915
659
 
916
- 📖 详细文档:[深度分页指南](./docs/findPage.md)
660
+ **数据库管理**
661
+ - 跨库访问
662
+ - Schema 验证
663
+ - 集合管理
664
+ - 数据库命令
665
+
666
+ ✅ **开发体验**
667
+ - TypeScript 支持
668
+ - 链式调用 API
669
+ - ESM/CommonJS 双模式
670
+ - 77% 测试覆盖率
671
+
672
+ </td>
673
+ </tr>
674
+ </table>
917
675
 
918
676
  ---
919
677
 
920
- ### 聚合查询
678
+ ## 🆚 与 MongoDB 原生驱动对比
921
679
 
922
- **支持缓存的聚合管道**:
680
+ <table>
681
+ <tr>
682
+ <th width="25%">特性</th>
683
+ <th width="25%">MongoDB 原生</th>
684
+ <th width="50%"><strong>monSQLize</strong></th>
685
+ </tr>
686
+ <tr>
687
+ <td><strong>API 兼容性</strong></td>
688
+ <td>✅ 原生</td>
689
+ <td>✅ 100% 兼容原生,无需学习新 API</td>
690
+ </tr>
691
+ <tr>
692
+ <td><strong>智能缓存</strong></td>
693
+ <td>❌ 需要自己实现</td>
694
+ <td>✅ 内置 TTL/LRU,开箱即用,10~100倍提升</td>
695
+ </tr>
696
+ <tr>
697
+ <td><strong>性能</strong></td>
698
+ <td>⭐⭐⭐ 基准性能</td>
699
+ <td>⭐⭐⭐⭐⭐ 缓存命中时性能提升 10~100 倍</td>
700
+ </tr>
701
+ <tr>
702
+ <td><strong>事务支持</strong></td>
703
+ <td>⭐⭐ 需要手动管理</td>
704
+ <td>⭐⭐⭐⭐⭐ 自动管理生命周期,优化只读操作</td>
705
+ </tr>
706
+ <tr>
707
+ <td><strong>分布式部署</strong></td>
708
+ <td>❌ 缓存不一致</td>
709
+ <td>✅ Redis 广播自动同步,保证一致性</td>
710
+ </tr>
711
+ <tr>
712
+ <td><strong>便利方法</strong></td>
713
+ <td>❌ 需要自己封装</td>
714
+ <td>✅ findOneById、findByIds、upsertOne 等</td>
715
+ </tr>
716
+ <tr>
717
+ <td><strong>运维监控</strong></td>
718
+ <td>⚠️ 需要额外配置</td>
719
+ <td>✅ 慢查询日志、性能统计,开箱即用</td>
720
+ </tr>
721
+ <tr>
722
+ <td><strong>学习成本</strong></td>
723
+ <td>⭐⭐⭐ MongoDB 语法</td>
724
+ <td>⭐ 零学习成本,API 完全一致</td>
725
+ </tr>
726
+ <tr>
727
+ <td><strong>迁移成本</strong></td>
728
+ <td>-</td>
729
+ <td>⭐ 只需修改初始化代码,业务代码不变</td>
730
+ </tr>
731
+ </table>
732
+
733
+ ### 📌 何时选择 monSQLize
734
+
735
+ ✅ **适合场景**:
736
+ - 高并发读取场景(商品详情、用户信息)
737
+ - 需要缓存但不想自己实现
738
+ - 多实例部署需要缓存一致性
739
+ - 希望零学习成本提升性能
740
+
741
+ ⚠️ **不适合场景**:
742
+ - 纯写入应用(缓存作用有限)
743
+ - 实时性要求极高(每次必查最新)
744
+ - 简单应用,流量不大(原生驱动足够)
745
+
746
+ ---
747
+
748
+ ## 🚀 快速迁移指南
749
+
750
+ ### 从 MongoDB 原生驱动迁移
923
751
 
924
752
  ```javascript
925
- // 聚合 + 缓存
926
- const result = await collection.aggregate([
927
- { $match: { status: 'active' } },
928
- { $group: {
929
- _id: '$city',
930
- count: { $sum: 1 },
931
- avgAge: { $avg: '$age' }
932
- }},
933
- { $sort: { count: -1 } },
934
- { $limit: 10 }
935
- ], {
936
- cache: 300000, // 缓存 5 分钟
937
- maxTimeMS: 5000
753
+ // 原来的代码
754
+ const { MongoClient } = require('mongodb');
755
+ const client = await MongoClient.connect('mongodb://localhost:27017');
756
+ const db = client.db('mydb');
757
+ const users = db.collection('users');
758
+
759
+ // 迁移后的代码(只需改 3 行)
760
+ const MonSQLize = require('monsqlize'); // 1. 引入 monSQLize
761
+ const db = new MonSQLize({ // 2. 修改初始化
762
+ type: 'mongodb',
763
+ config: { uri: 'mongodb://localhost:27017/mydb' },
764
+ cache: { enabled: true } // 3. 启用缓存
938
765
  });
766
+ await db.connect();
767
+ const users = db.collection('users');
939
768
 
940
- console.log('Top 10 城市:', result);
769
+ // 🎉 后续所有代码不需要改动,性能提升 10~100 倍!
770
+ const user = await users.findOne({ email }); // 完全一样的 API
941
771
  ```
942
772
 
943
- **复杂聚合示例**:
773
+ ### 渐进式迁移
944
774
 
945
775
  ```javascript
946
- // 多阶段聚合
947
- const salesReport = await collection.aggregate([
948
- // 1. 时间范围筛选
949
- { $match: {
950
- date: {
951
- $gte: startDate,
952
- $lte: endDate
953
- }
954
- }},
955
-
956
- // 2. 数据转换
957
- { $project: {
958
- year: { $year: '$date' },
959
- month: { $month: '$date' },
960
- revenue: 1,
961
- category: 1
962
- }},
963
-
964
- // 3. 分组统计
965
- { $group: {
966
- _id: { year: '$year', month: '$month', category: '$category' },
967
- totalRevenue: { $sum: '$revenue' },
968
- count: { $sum: 1 }
969
- }},
970
-
971
- // 4. 排序
972
- { $sort: { '_id.year': -1, '_id.month': -1, totalRevenue: -1 } }
973
- ], {
974
- cache: 600000, // 缓存 10 分钟
975
- allowDiskUse: true // 允许使用磁盘(大数据)
976
- });
977
- ```
776
+ // ✅ 可以混用原生驱动和 monSQLize
777
+ const nativeClient = await MongoClient.connect('...');
778
+ const monsqlize = new MonSQLize({ cache: { enabled: true } });
978
779
 
979
- 📖 详细文档:[aggregate](./docs/aggregate.md)
780
+ // 性能敏感的查询用 monSQLize(启用缓存)
781
+ const hotData = await monsqlize.collection('products').find({}, { cache: 60000 });
782
+
783
+ // 简单查询用原生驱动
784
+ const coldData = await nativeClient.db('mydb').collection('logs').find({});
785
+ ```
980
786
 
981
787
  ---
982
788
 
983
- ## 📚 完整文档
789
+ ## 📖 完整文档
984
790
 
985
791
  ### 核心文档
986
792
 
987
793
  - 📖 [完整 API 文档索引](./docs/INDEX.md)
988
794
  - 📖 [MongoDB 原生 vs monSQLize 对比](./docs/mongodb-native-vs-extensions.md)
989
795
  - 📖 [事务使用指南](./docs/transaction.md)
796
+ - 📖 [业务级分布式锁](./docs/business-lock.md) 🆕 v1.4.0
797
+ - 📖 [SSH隧道使用指南](./docs/ssh-tunnel.md) 🆕 v1.3+
990
798
  - 📖 [分布式部署指南](./docs/distributed-deployment.md)
991
799
  - 📖 [性能优化指南](./docs/transaction-optimizations.md)
992
800
 
@@ -1002,123 +810,63 @@ const salesReport = await collection.aggregate([
1002
810
  - [findOneById](./docs/find-one-by-id.md) | [findByIds](./docs/find-by-ids.md)
1003
811
  - [upsertOne](./docs/upsert-one.md) | [incrementOne](./docs/increment-one.md) | [findAndCount](./docs/find-and-count.md)
1004
812
 
1005
- **Admin/Management**:
1006
- - [运维监控](./docs/admin.md) | [数据库操作](./docs/database-ops.md)
1007
- - [Schema 验证](./docs/validation.md) | [集合管理](./docs/collection-mgmt.md)
1008
-
1009
813
  **其他功能**:
1010
- - [索引管理](./docs/indexes.md) | [聚合查询](./docs/aggregate.md)
814
+ - [索引管理](./docs/create-index.md) | [聚合查询](./docs/aggregate.md)
1011
815
  - [缓存系统](./docs/cache.md) | [链式调用](./docs/chaining-api.md)
1012
816
 
1013
817
  ### 示例代码
1014
818
 
1015
- - 📁 [完整示例代码目录](./examples/)
1016
- - 50+ 可运行示例,涵盖所有功能场景
819
+ - 📁 [完整示例代码目录](./examples/) - 50+ 可运行示例
1017
820
 
1018
821
  ---
1019
822
 
1020
- ## 📊 性能基准
823
+ ## 🌍 兼容性
1021
824
 
1022
- 运行性能基准测试:
825
+ | 环境 | 支持版本 |
826
+ |------|---------|
827
+ | **Node.js** | 16.x, 18.x, 20.x, 21.x |
828
+ | **MongoDB** | 4.4+, 5.x, 6.x, 7.x |
829
+ | **MongoDB Driver** | 4.x, 5.x, 6.x, 7.x |
830
+ | **模块系统** | CommonJS, ESM |
1023
831
 
1024
- ```bash
1025
- npm run benchmark
1026
- ```
1027
-
1028
- 查看详细基准测试报告:
1029
- - [批量插入基准](./test/benchmark/insertBatch-benchmark.js)
1030
- - [事务性能基准](./test/performance/transaction-benchmark.js)
832
+ [查看完整兼容性矩阵](./docs/COMPATIBILITY.md)
1031
833
 
1032
834
  ---
1033
835
 
1034
- ## 🔧 兼容性
1035
-
1036
- ### ✅ 完整兼容性测试
1037
-
1038
- monSQLize 已经过全面的多版本兼容性测试,确保在不同环境下稳定运行。
1039
-
1040
- #### Node.js 版本
1041
-
1042
- | 版本 | 支持状态 | 测试状态 |
1043
- |------|---------|---------|
1044
- | 14.x | ✅ 支持 | ✅ 已测试 |
1045
- | 16.x | ✅ 支持 | ✅ 已测试 |
1046
- | 18.x | ✅ 完全支持 | ✅ 已测试(推荐)|
1047
- | 20.x | ✅ 完全支持 | ✅ 已测试(推荐)|
1048
- | 22.x | ✅ 支持 | ✅ 已测试 |
1049
-
1050
- #### MongoDB 驱动版本
1051
-
1052
- | 版本 | 支持状态 | 测试状态 | 测试日期 | 说明 |
1053
- |------|---------|---------|---------|------|
1054
- | 4.x (4.17.2) | ✅ 完全支持 | ✅ 已测试 | 2025-01-02 | 自动适配 API 差异 |
1055
- | 5.x (5.9.2) | ✅ 完全支持 | ✅ 已测试 | 2025-01-02 | 自动统一返回值 |
1056
- | 6.x (6.17.0) | ✅ 完全支持 | ✅ 已测试 | 2025-01-02 | 推荐使用 |
1057
- | 7.x (7.0.0) | ✅ 完全支持 | ✅ 已测试 | 2025-01-02 | 最新版本 |
1058
-
1059
- **✅ 测试验证** (2025-01-02):
1060
- - Driver 7.0.0: ✅ 通过(103.49s,100% 通过率)
1061
- - 测试套件: 30/30 通过
1062
- - 测试用例: 102 个全部通过
1063
-
1064
- **✅ 自动处理的差异**:
1065
- - ✅ **findOneAnd* 返回值统一**:Driver 4.x/5.x/6.x 的返回值格式完全统一
1066
- - ✅ **连接选项自动适配**:自动处理 `useNewUrlParser` 等选项差异
1067
- - ✅ **版本特性自动检测**:自动识别 Driver 版本并启用相应功能
1068
-
1069
- **用户无需关心版本差异**:
1070
- ```javascript
1071
- // 所有 Driver 版本代码完全相同
1072
- const user = await collection.findOneAndUpdate(
1073
- { name: 'Alice' },
1074
- { $set: { age: 31 } }
1075
- );
1076
- // ✅ 统一返回:{ _id: ..., name: "Alice", age: 31 }
1077
- ```
1078
-
1079
- #### MongoDB Server 版本
1080
-
1081
- | 版本 | 支持状态 | 测试状态 | 特性限制 |
1082
- |------|---------|---------|---------|
1083
- | 4.4 | ✅ 支持 | ✅ 已测试 | 基础功能 |
1084
- | 5.0 | ✅ 完全支持 | ✅ 已测试 | 时间序列集合 |
1085
- | 6.0 | ✅ 完全支持 | ✅ 已测试(推荐)| 加密字段 |
1086
- | 7.0 | ✅ 完全支持 | ✅ 已测试 | 最新特性 |
1087
-
1088
- **智能特性探测**:
1089
- - ✅ 自动检测 Server 版本
1090
- - ✅ 特性支持探测(事务、索引、聚合)
1091
- - ✅ 条件性测试(自动跳过不支持的特性)
1092
-
1093
- ### 📚 兼容性文档
1094
-
1095
- - 📖 [**完整兼容性矩阵**](./docs/COMPATIBILITY.md) - 所有版本的详细支持说明
1096
- - 📖 [**兼容性测试指南**](./docs/COMPATIBILITY-TESTING-GUIDE.md) - 如何运行兼容性测试
1097
- - 📖 [MongoDB 驱动差异详解](./docs/mongodb-driver-compatibility.md) - Driver 5.x vs 6.x 差异
836
+ ## 🗺️ 产品路线图
1098
837
 
1099
- ### 🧪 运行兼容性测试
838
+ ### v1.4 (当前版本)
1100
839
 
1101
- ```bash
1102
- # 快速测试当前环境
1103
- npm run test:compatibility:server:quick
840
+ - ✅ 业务级分布式锁
841
+ - ✅ 智能缓存系统
842
+ - 事务优化
843
+ - ✅ 便利方法
844
+ - ✅ 分布式支持
1104
845
 
1105
- # 测试所有 Node.js 版本(需要 nvm/volta)
1106
- npm run test:compatibility:node
846
+ ### 🚧 v1.5 (计划中)
1107
847
 
1108
- # 测试所有 MongoDB Driver 版本
1109
- npm run test:compatibility:driver
848
+ - 🔄 查询分析器
849
+ - 🔄 自动索引建议
850
+ - 🔄 数据迁移工具
851
+ - 🔄 GraphQL 支持
1110
852
 
1111
- # 测试所有 MongoDB Server 版本
1112
- npm run test:compatibility:server
1113
- ```
853
+ ### 🔮 v2.0 (未来)
1114
854
 
1115
- 查看 [兼容性测试指南](./docs/COMPATIBILITY-TESTING-GUIDE.md) 了解更多。
855
+ - 🔮 统一 API 支持 MySQL
856
+ - 🔮 统一 API 支持 PostgreSQL
857
+ - 🔮 ORM 功能
858
+ - 🔮 数据同步中间件
1116
859
 
1117
860
  ---
1118
861
 
1119
862
  ## 🤝 贡献指南
1120
863
 
1121
- 欢迎贡献!请查看 [CONTRIBUTING.md](./CONTRIBUTING.md)
864
+ 我们欢迎所有形式的贡献!
865
+
866
+ - 🐛 [提交 Bug](https://github.com/vextjs/monSQLize/issues)
867
+ - 💡 [提出新功能](https://github.com/vextjs/monSQLize/issues)
868
+ - 📖 [改进文档](https://github.com/vextjs/monSQLize/pulls)
869
+ - 💻 [提交代码](https://github.com/vextjs/monSQLize/pulls)
1122
870
 
1123
871
  ### 开发
1124
872
 
@@ -1133,236 +881,48 @@ npm install
1133
881
  # 运行测试
1134
882
  npm test
1135
883
 
1136
- # 运行单个测试套件
1137
- npm run test:unit
1138
-
1139
- # 检查测试覆盖率
1140
- npm run coverage
1141
-
1142
- # 运行 Lint 检查
1143
- npm run lint
1144
- ```
1145
-
1146
- ---
1147
-
1148
- ## 🗺️ 产品路线图
1149
-
1150
- ### v1.x - MongoDB 专注版 ✅ (当前)
1151
-
1152
- **已完成功能**:
1153
- - ✅ **MongoDB 完整支持** (Driver 4.x - 7.x)
1154
- - 16 个 CRUD 方法
1155
- - 5 个索引管理方法
1156
- - 8 个事务方法
1157
- - 18 个 Admin/Management 方法
1158
-
1159
- - ✅ **智能缓存系统**
1160
- - TTL(时间过期)
1161
- - LRU(最近最少使用淘汰)
1162
- - 自动缓存失效
1163
- - Redis 分布式广播
1164
-
1165
- - ✅ **性能优化**
1166
- - 10-100x 查询性能提升
1167
- - 25x 批量插入性能
1168
- - -30% 事务 DB 访问
1169
- - 16x 并发性能(文档级锁)
1170
-
1171
- - ✅ **企业级特性**
1172
- - 分布式部署(Redis Pub/Sub)
1173
- - 慢查询日志
1174
- - 性能监控
1175
- - 健康检查
1176
-
1177
- - ✅ **便利方法**
1178
- - `findOneById` / `findByIds`
1179
- - `upsertOne` / `incrementOne`
1180
- - `findAndCount`
1181
-
1182
- **测试和文档**:
1183
- - ✅ 77%+ 测试覆盖率
1184
- - ✅ 100% API 文档
1185
- - ✅ 50+ 可运行示例
1186
- - ✅ 兼容性测试(Driver 4.x-7.x, Node.js 14-22)
1187
-
1188
- ---
1189
-
1190
- ### v2.x - 多数据库统一 API 📋 (规划中)
1191
-
1192
- **核心目标**:使用统一的 MongoDB 风格 API 操作多种数据库
1193
-
1194
- #### MySQL 支持
1195
- ```javascript
1196
- // 统一的 MongoDB 风格 API
1197
- const db = new MonSQLize({
1198
- type: 'mysql', // ← 新增支持
1199
- config: {
1200
- host: 'localhost',
1201
- user: 'root',
1202
- database: 'mydb'
1203
- }
1204
- });
1205
-
1206
- await db.connect();
1207
- const users = db.collection('users');
1208
-
1209
- // 使用 MongoDB 语法查询 MySQL
1210
- await users.find({
1211
- status: 'active',
1212
- age: { $gte: 18 }
1213
- });
1214
- // ↓ 自动转换为 SQL
1215
- // SELECT * FROM users WHERE status = 'active' AND age >= 18
1216
-
1217
- // MongoDB 风格的更新
1218
- await users.updateOne(
1219
- { _id: 1 },
1220
- { $set: { name: 'Alice' }, $inc: { loginCount: 1 } }
1221
- );
1222
- // ↓ 自动转换为 SQL
1223
- // UPDATE users SET name = 'Alice', loginCount = loginCount + 1 WHERE id = 1
1224
-
1225
- // 聚合查询
1226
- await users.aggregate([
1227
- { $match: { status: 'active' } },
1228
- { $group: { _id: '$role', count: { $sum: 1 } } }
1229
- ]);
1230
- // ↓ 自动转换为 SQL
1231
- // SELECT role, COUNT(*) as count FROM users WHERE status = 'active' GROUP BY role
1232
- ```
1233
-
1234
- #### PostgreSQL 支持
1235
- ```javascript
1236
- const db = new MonSQLize({
1237
- type: 'postgres', // ← 新增支持
1238
- config: {
1239
- host: 'localhost',
1240
- database: 'mydb'
1241
- }
1242
- });
1243
-
1244
- // JSONB 字段自动映射
1245
- await users.find({
1246
- 'metadata.tags': { $in: ['tech', 'news'] }
1247
- });
1248
- // ↓ 利用 PostgreSQL 的 JSONB 特性
1249
- // SELECT * FROM users WHERE metadata->'tags' ?| ARRAY['tech', 'news']
1250
-
1251
- // 数组操作
1252
- await users.updateOne(
1253
- { _id: 1 },
1254
- { $push: { 'metadata.tags': 'featured' } }
1255
- );
1256
- // ↓ PostgreSQL 数组操作
1257
- // UPDATE users SET metadata = jsonb_set(metadata, '{tags}', ...) WHERE id = 1
884
+ # 运行基准测试
885
+ npm run benchmark
1258
886
  ```
1259
887
 
1260
- **技术路线**:
1261
- 1. **定义统一查询 AST**(抽象语法树)
1262
- - MongoDB 查询 → AST → SQL 转换
1263
- - 支持 90% 常用 MongoDB 操作符
1264
-
1265
- 2. **SQL 方言适配器**
1266
- - MySQL: `LIMIT`, `AUTO_INCREMENT`
1267
- - PostgreSQL: `JSONB`, `RETURNING`
1268
- - SQL Server: `TOP`, `IDENTITY`
1269
-
1270
- 3. **保持核心功能**
1271
- - 智能缓存(跨数据库)
1272
- - 事务管理(适配各数据库)
1273
- - 性能监控
1274
-
1275
- 4. **操作符映射表**
1276
-
1277
- | MongoDB 操作符 | MySQL | PostgreSQL | SQL Server |
1278
- |---------------|-------|------------|------------|
1279
- | `$eq` (等于) | `=` | `=` | `=` |
1280
- | `$ne` (不等于) | `!=` | `<>` | `<>` |
1281
- | `$gt` (大于) | `>` | `>` | `>` |
1282
- | `$gte` (大于等于) | `>=` | `>=` | `>=` |
1283
- | `$lt` (小于) | `<` | `<` | `<` |
1284
- | `$lte` (小于等于) | `<=` | `<=` | `<=` |
1285
- | `$in` (在数组中) | `IN (...)` | `IN (...)` | `IN (...)` |
1286
- | `$nin` (不在数组中) | `NOT IN (...)` | `NOT IN (...)` | `NOT IN (...)` |
1287
- | `$regex` (正则匹配) | `REGEXP` | `~` | `LIKE` |
1288
- | `$exists` (字段存在) | `IS NOT NULL` | `IS NOT NULL` | `IS NOT NULL` |
1289
- | `$set` (设置字段) | `SET col = val` | `SET col = val` | `SET col = val` |
1290
- | `$inc` (递增) | `SET col = col + n` | `SET col = col + n` | `SET col = col + n` |
1291
- | `$unset` (删除字段) | `SET col = NULL` | `SET col = NULL` | `SET col = NULL` |
1292
- | `$push` (数组添加) | `JSON_ARRAY_APPEND()` | `array_append()` | `JSON_MODIFY()` |
1293
- | `$pull` (数组删除) | `JSON_REMOVE()` | `array_remove()` | `JSON_MODIFY()` |
1294
- | `$addToSet` (集合添加) | `JSON_ARRAY_APPEND()` | `array_append()` | `JSON_MODIFY()` |
1295
-
1296
- **限制说明**:
1297
- - ⚠️ 某些 MongoDB 特性无法完美映射(如 `$lookup` 跨集合)
1298
- - ⚠️ 性能可能不如原生 SQL(增加了转换层)
1299
- - ✅ 90% 常用场景可以无缝支持
1300
-
1301
- **预计时间**:2025 Q3-Q4
1302
-
1303
888
  ---
1304
889
 
1305
- ### v3.x - 生态扩展 🔮 (未来)
890
+ ## 📄 许可证
1306
891
 
1307
- **可能方向**:
1308
- - 🔮 **SQL Server 支持**
1309
- - 🔮 **Redis 作为主数据库**(文档存储)
1310
- - 🔮 **其他 NoSQL**(Cassandra, DynamoDB)
1311
- - 🔮 **混合查询**(跨数据库 Join)
1312
- - 🔮 **数据库迁移工具**(MongoDB ↔ MySQL)
1313
- - 🔮 **查询优化器**(自动选择最优执行计划)
892
+ [MIT License](./LICENSE)
1314
893
 
1315
894
  ---
1316
895
 
1317
- ### 🤝 欢迎贡献
896
+ ## 💬 社区与支持
1318
897
 
1319
- 如果你对多数据库支持感兴趣,欢迎参与:
1320
-
1321
- **贡献方式**:
1322
- - 💡 **提出设计建议** - [GitHub Issues](https://github.com/vextjs/monSQLize/issues)
1323
- - 🔧 **贡献代码** - [Pull Requests](https://github.com/vextjs/monSQLize/pulls)
1324
- - 📖 **完善文档** - 帮助改进文档
1325
- - 🧪 **提供测试用例** - 增加测试覆盖率
1326
- - 🌍 **国际化** - 翻译文档到其他语言
1327
-
1328
- **技术栈**:
1329
- - Node.js 14+
1330
- - MongoDB Driver
1331
- - (未来) MySQL/PostgreSQL Drivers
1332
- - TypeScript (类型定义)
1333
-
1334
- **联系方式**:
1335
- - 📧 Email: contact@vext.dev
1336
- - 💬 GitHub: [@vextjs](https://github.com/vextjs)
1337
- - 📖 文档: [贡献指南](./CONTRIBUTING.md)
898
+ - 📧 **Email**: support@monsqlize.dev
899
+ - 💬 **Issues**: [GitHub Issues](https://github.com/vextjs/monSQLize/issues)
900
+ - 📖 **文档**: [完整文档](./docs/INDEX.md)
901
+ - 🌟 **Star**: 如果觉得有用,请给我们一个 Star
1338
902
 
1339
903
  ---
1340
904
 
1341
- ## 📄 许可证
1342
-
1343
- [MIT License](./LICENSE)
1344
-
1345
- ---
905
+ ## 🎉 快速链接
1346
906
 
1347
- ## 🌟 Star History
907
+ <div align="center">
1348
908
 
1349
- 如果这个项目对你有帮助,请给我们一个 Star
909
+ **[🚀 快速开始](#-5分钟快速开始)** ·
910
+ **[📚 完整文档](./docs/INDEX.md)** ·
911
+ **[💻 示例代码](./examples/)** ·
912
+ **[🐛 报告问题](https://github.com/vextjs/monSQLize/issues)** ·
913
+ **[⭐ Star 项目](https://github.com/vextjs/monSQLize)**
1350
914
 
1351
915
  ---
1352
916
 
1353
- ## 📞 联系方式
917
+ ### MongoDB 快 10~100 倍,从现在开始 🚀
1354
918
 
1355
- - 📧 Email: contact@vext.dev
1356
- - 💬 Issues: [GitHub Issues](https://github.com/vextjs/monSQLize/issues)
1357
- - 📖 文档: [完整文档](./docs/INDEX.md)
919
+ ```bash
920
+ npm install monsqlize
921
+ ```
1358
922
 
1359
923
  ---
1360
924
 
1361
- <div align="center">
1362
-
1363
- **由 ❤️ 用心打造**
1364
-
1365
- [GitHub](https://github.com/vextjs/monSQLize) | [npm](https://www.npmjs.com/package/monsqlize) | [文档](./docs/INDEX.md) | [示例](./examples/)
925
+ Made with ❤️ by monSQLize Team
1366
926
 
1367
927
  </div>
1368
928