monsqlize 1.0.2 → 1.0.5

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.
package/CHANGELOG.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # 变更日志 (CHANGELOG)
2
2
 
3
3
  > **说明**: 版本摘要,详细需求见 [STATUS.md](STATUS.md)
4
- > **最后更新**: 2025-12-29
4
+ > **最后更新**: 2025-12-31
5
5
 
6
6
  ---
7
7
 
@@ -9,11 +9,131 @@
9
9
 
10
10
  | 版本 | 日期 | 变更摘要 | 详细 |
11
11
  |------|------|---------|------|
12
+ | [v1.0.3](STATUS.md#v103) | 2025-12-31 | 新增 Model 层(Schema 验证、自定义方法、生命周期钩子、自动时间戳) | [查看](STATUS.md#v103) |
13
+ | [v1.0.2](STATUS.md#v102) | 2025-12-30 | 新增批量操作方法(deleteBatch/updateBatch) | [查看](STATUS.md#v102) |
12
14
  | [v1.0.1](STATUS.md#v101) | 2025-12-29 | 稳定版本,生产就绪 | [查看](STATUS.md#v101) |
13
15
  | [v1.0.0](STATUS.md#v100) | 2025-12-03 | 正式发布,生产就绪,已发布到 npm | [查看](STATUS.md#v100) |
14
16
 
15
17
  ---
16
18
 
19
+ ## 🆕 v1.0.3 变更详情(2025-12-31)
20
+
21
+ ### 新增功能 ✨
22
+
23
+ **Model 层** - ORM 式的数据模型功能
24
+ - ✅ **Schema 验证** - 集成 schema-dsl,自动验证数据格式
25
+ - ✅ **自定义方法** - instance 方法注入到文档,static 方法挂载到 Model
26
+ - ✅ **生命周期钩子** - before/after 钩子支持(find/insert/update/delete)
27
+ - ✅ **索引自动创建** - 初始化时自动创建索引
28
+ - ✅ **枚举配置** - 可在 schema 中引用的枚举定义
29
+ - ✅ **自动时间戳** - 自动管理 createdAt/updatedAt,支持自定义字段名
30
+
31
+ ### 核心 API 🔧
32
+
33
+ ```javascript
34
+ // 定义 Model
35
+ Model.define('users', {
36
+ schema: (dsl) => dsl({ username: 'string!', email: 'email!' }),
37
+ methods: (model) => ({
38
+ instance: { checkPassword(pwd) { return this.password === pwd; } },
39
+ static: { async findByUsername(name) { return await model.findOne({ username: name }); } }
40
+ }),
41
+ hooks: (model) => ({
42
+ insert: { before: async (ctx, docs) => ({ ...docs, createdAt: new Date() }) }
43
+ }),
44
+ indexes: [{ key: { username: 1 }, unique: true }]
45
+ });
46
+
47
+ // 使用 Model
48
+ const User = msq.model('users');
49
+ const user = await User.findByUsername('admin');
50
+ if (user.checkPassword('secret')) console.log('登录成功');
51
+ ```
52
+
53
+ ### 测试覆盖 ✅
54
+
55
+ - 新增 45 个单元测试
56
+ - Model 基础功能:16个(100%通过)
57
+ - ModelInstance:23个
58
+ - Hooks:6个
59
+ - 测试覆盖率:~90%
60
+
61
+ ### 文档完善 📖
62
+
63
+ - 新增 `docs/model.md` - 完整 API 文档(495行,精简版)
64
+ - 新增 `docs/model-methods-design.md` - 设计文档(295行)
65
+ - 新增 `examples/model/basic.js` - 基础使用示例
66
+ - 新增 `examples/model/advanced.js` - 高级功能示例
67
+ - 新增 TypeScript 类型定义(+300行)
68
+ - 更新 `README.md`、`docs/INDEX.md`
69
+
70
+ ### 设计亮点 💡
71
+
72
+ - ✅ **业界标准** - 参考 Mongoose、Sequelize,降低学习成本
73
+ - ✅ **Schema 缓存** - 编译一次,重复使用,性能优化
74
+ - ✅ **方法注入** - 自动注入到查询结果,使用自然
75
+ - ✅ **TypeScript 支持** - 完整的泛型类型定义
76
+ - ✅ **灵活配置** - 所有选项都可选,渐进式采用
77
+
78
+ ### 使用场景 🎯
79
+
80
+ - ✅ 需要数据验证的场景
81
+ - ✅ 需要扩展文档方法的场景
82
+ - ✅ 需要生命周期控制的场景
83
+ - ✅ 需要类 ORM 体验的场景
84
+
85
+ ---
86
+
87
+ ## 🆕 v1.0.2 变更详情(2025-12-30)
88
+
89
+ ### 新增功能 ✨
90
+
91
+ **批量操作方法** - 支持大数据量场景
92
+ - ✅ **deleteBatch** - 批量删除方法
93
+ - 流式查询,恒定内存占用(12KB)
94
+ - 支持进度监控(实时百分比)
95
+ - 4种错误处理策略(stop/skip/collect/retry)
96
+ - 自动重试机制
97
+ - 性能:36,385 条/秒(100万条数据实测)
98
+
99
+ - ✅ **updateBatch** - 批量更新方法
100
+ - 流式查询,恒定内存占用(12KB)
101
+ - 支持进度监控(实时百分比)
102
+ - 支持所有 MongoDB 更新操作符
103
+ - 4种错误处理策略 + 自动重试
104
+ - 性能:35,365 条/秒(100万条数据实测)
105
+
106
+ ### 性能数据 📊
107
+
108
+ ```
109
+ 批量操作性能(100万条数据测试):
110
+ - insertBatch: 49,493 条/秒
111
+ - deleteBatch: 36,385 条/秒
112
+ - updateBatch: 35,365 条/秒
113
+ - 内存占用: 恒定 12KB
114
+ ```
115
+
116
+ ### 测试覆盖 ✅
117
+
118
+ - 新增 31 个单元测试(deleteBatch: 14个,updateBatch: 17个)
119
+ - 性能测试通过(100万条数据)
120
+ - 测试覆盖率 > 90%
121
+
122
+ ### 文档完善 📖
123
+
124
+ - 新增 `docs/deleteBatch.md` - 完整 API 文档(650行)
125
+ - 新增 `docs/updateBatch.md` - 完整 API 文档(600行)
126
+ - 新增 `examples/batch-operations.examples.js` - 8个真实业务场景
127
+ - 更新 `README.md` 和 `docs/INDEX.md`
128
+
129
+ ### 技术亮点 💡
130
+
131
+ - ✅ **完全复用 find 方法** - 0行重复代码,自动获得流式查询、慢查询日志等功能
132
+ - ✅ **架构最简** - 单一流式查询实现,数据一致性有保证
133
+ - ✅ **内存优化** - 流式查询,无论处理多少数据,内存占用恒定 12KB
134
+ - ✅ **错误处理完善** - 4种策略 + 自动重试,适应不同业务场景
135
+
136
+ ---
17
137
 
18
138
  ## 🆕 v1.0.1 变更详情(2025-12-29)
19
139
 
@@ -45,7 +165,7 @@
45
165
 
46
166
  | 版本系列 | 版本数 | 主要改进方向 |
47
167
  |---------|-------|------------|
48
- | v1.0.x | 2 | 稳定运行、生产就绪 |
168
+ | v1.0.x | 3 | 稳定运行、生产就绪、批量操作优化 |
49
169
 
50
170
  ---
51
171
 
package/README.md CHANGED
@@ -39,6 +39,7 @@ npm install monsqlize
39
39
  - [7. 📊 深度分页](#7--深度分页---支持千万级数据)
40
40
  - [8. 🛠️ 运维监控](#8-️-运维监控开箱即用)
41
41
  - [9. 🔐 SSH隧道](#9--ssh隧道---安全连接内网数据库v13)
42
+ - [10. 🎯 Model 层](#10--model-层---像-orm-一样使用v103)
42
43
  - [📊 性能测试报告](#-性能测试报告)
43
44
  - [🎨 完整功能清单](#-完整功能清单)
44
45
  - [🆚 与 MongoDB 原生驱动对比](#-与-mongodb-原生驱动对比)
@@ -549,6 +550,111 @@ await db.close(); // 自动关闭SSH隧道
549
550
 
550
551
  ---
551
552
 
553
+ ### 10. 🎯 Model 层 - 像 ORM 一样使用(v1.0.3+)
554
+
555
+ monSQLize 提供了一个轻量级的 Model 层,让你可以像使用 ORM 一样定义数据模型,同时保持 MongoDB 的灵活性。
556
+
557
+ ```javascript
558
+ const { Model } = require('monsqlize');
559
+
560
+ // 1. 定义 Model(集成 schema-dsl 验证)
561
+ Model.define('users', {
562
+ enums: {
563
+ role: 'admin|user|guest'
564
+ },
565
+ schema: function(dsl) {
566
+ return dsl({
567
+ username: 'string:3-32!',
568
+ email: 'email!',
569
+ role: this.enums.role.default('user'),
570
+ age: 'number:1-150'
571
+ });
572
+ },
573
+ options: {
574
+ timestamps: true, // 🆕 v1.0.3: 自动管理 createdAt/updatedAt
575
+ softDelete: true // 🆕 v1.0.3: 软删除(标记删除,支持恢复)
576
+ },
577
+ methods: (model) => ({
578
+ // 实例方法 - 注入到查询返回的文档对象
579
+ instance: {
580
+ isAdmin() {
581
+ return this.role === 'admin';
582
+ }
583
+ },
584
+ // 静态方法 - 挂载到 Model 实例
585
+ static: {
586
+ async findByEmail(email) {
587
+ return await model.findOne({ email });
588
+ }
589
+ }
590
+ }),
591
+ hooks: (model) => ({
592
+ // 生命周期钩子
593
+ insert: {
594
+ before: (ctx, docs) => {
595
+ // 自动添加时间戳
596
+ return { ...docs, createdAt: new Date() };
597
+ }
598
+ }
599
+ }),
600
+ indexes: [
601
+ { key: { username: 1 }, unique: true },
602
+ { key: { email: 1 }, unique: true }
603
+ ]
604
+ });
605
+
606
+ // 2. 使用 Model
607
+ const db = new MonSQLize({ /* ... */ });
608
+ await db.connect();
609
+
610
+ const User = db.model('users');
611
+
612
+ // 自动 Schema 验证
613
+ const user = await User.insertOne({
614
+ username: 'john',
615
+ email: 'john@example.com',
616
+ age: 25
617
+ }); // ✅ 验证通过
618
+
619
+ // 使用实例方法
620
+ const admin = await User.findOne({ username: 'admin' });
621
+ console.log(admin.isAdmin()); // true
622
+
623
+ // 使用静态方法
624
+ const user = await User.findByEmail('john@example.com');
625
+
626
+ // 软删除(标记删除,可恢复)
627
+ await User.deleteOne({ _id: user._id });
628
+
629
+ // 查询(自动过滤已删除)
630
+ const users = await User.find({}); // 不包含已删除用户
631
+
632
+ // 查询包含已删除
633
+ const allUsers = await User.findWithDeleted({});
634
+
635
+ // 恢复已删除
636
+ await User.restore({ _id: user._id });
637
+ ```
638
+
639
+ **特性**:
640
+ - ✅ Schema 验证(集成 schema-dsl)
641
+ - ✅ 自定义方法(instance + static)
642
+ - ✅ 生命周期钩子(before/after)
643
+ - ✅ 索引自动创建
644
+ - ✅ 自动时间戳(v1.0.3+)
645
+ - ✅ 软删除(v1.0.3+)
646
+ - ✅ 乐观锁版本控制(v1.0.3+)
647
+ - ✅ TypeScript 类型支持
648
+
649
+ **注意**:需要安装 `schema-dsl` 依赖:
650
+ ```bash
651
+ npm install schema-dsl
652
+ ```
653
+
654
+ [📖 Model 层详细文档](./docs/model.md)
655
+
656
+ ---
657
+
552
658
  ## 📊 性能测试报告
553
659
 
554
660
  ### 测试环境
@@ -630,7 +736,9 @@ await db.close(); // 自动关闭SSH隧道
630
736
  - findAndCount
631
737
 
632
738
  ✅ **性能优化**
633
- - 批量插入优化
739
+ - insertBatch - 批量插入优化
740
+ - deleteBatch - 批量删除(流式+进度监控)
741
+ - updateBatch - 批量更新(流式+进度监控)
634
742
  - 只读事务优化
635
743
  - Count 队列控制
636
744
  - 连接池管理
@@ -803,8 +911,11 @@ const coldData = await nativeClient.db('mydb').collection('logs').find({});
803
911
  **CRUD 操作**:
804
912
  - [find](./docs/find.md) | [findOne](./docs/findOne.md) | [findPage](./docs/findPage.md)
805
913
  - [insertOne](./docs/insert-one.md) | [insertMany](./docs/insert-many.md) | [insertBatch](./docs/insertBatch.md)
806
- - [updateOne](./docs/update-one.md) | [updateMany](./docs/update-many.md) | [replaceOne](./docs/replace-one.md)
807
- - [deleteOne](./docs/delete-one.md) | [deleteMany](./docs/delete-many.md)
914
+ - [updateOne](./docs/update-one.md) | [updateMany](./docs/update-many.md) | [updateBatch](./docs/updateBatch.md) | [replaceOne](./docs/replace-one.md)
915
+ - [deleteOne](./docs/delete-one.md) | [deleteMany](./docs/delete-many.md) | [deleteBatch](./docs/deleteBatch.md)
916
+
917
+ **Model 层**:
918
+ - [Model API 文档](./docs/model.md) - Schema 验证、自定义方法、生命周期钩子
808
919
 
809
920
  **便利方法**:
810
921
  - [findOneById](./docs/find-one-by-id.md) | [findByIds](./docs/find-by-ids.md)
@@ -842,6 +953,7 @@ const coldData = await nativeClient.db('mydb').collection('logs').find({});
842
953
  - ✅ 事务优化
843
954
  - ✅ 便利方法
844
955
  - ✅ 分布式支持
956
+ - ✅ Model 层(v1.0.3)- Schema 验证、自定义方法、生命周期钩子
845
957
 
846
958
  ### 🚧 v1.5 (计划中)
847
959
 
@@ -849,12 +961,13 @@ const coldData = await nativeClient.db('mydb').collection('logs').find({});
849
961
  - 🔄 自动索引建议
850
962
  - 🔄 数据迁移工具
851
963
  - 🔄 GraphQL 支持
964
+ - 🔄 Model 关系(relations)完善
852
965
 
853
966
  ### 🔮 v2.0 (未来)
854
967
 
855
968
  - 🔮 统一 API 支持 MySQL
856
969
  - 🔮 统一 API 支持 PostgreSQL
857
- - 🔮 ORM 功能
970
+ - 🔮 完整 ORM 功能
858
971
  - 🔮 数据同步中间件
859
972
 
860
973
  ---