@yanit/jsondb 0.1.1

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 (118) hide show
  1. package/README.md +903 -0
  2. package/dist/bin/cli-export.d.ts +7 -0
  3. package/dist/bin/cli-export.d.ts.map +1 -0
  4. package/dist/bin/cli-export.js +318 -0
  5. package/dist/bin/cli-export.js.map +1 -0
  6. package/dist/bin/cli-import.d.ts +7 -0
  7. package/dist/bin/cli-import.d.ts.map +1 -0
  8. package/dist/bin/cli-import.js +298 -0
  9. package/dist/bin/cli-import.js.map +1 -0
  10. package/dist/bin/server.d.ts +7 -0
  11. package/dist/bin/server.d.ts.map +1 -0
  12. package/dist/bin/server.js +92 -0
  13. package/dist/bin/server.js.map +1 -0
  14. package/dist/examples/sql-example.d.ts +7 -0
  15. package/dist/examples/sql-example.d.ts.map +1 -0
  16. package/dist/examples/sql-example.js +131 -0
  17. package/dist/examples/sql-example.js.map +1 -0
  18. package/dist/src/BulkOp.d.ts +74 -0
  19. package/dist/src/BulkOp.d.ts.map +1 -0
  20. package/dist/src/BulkOp.js +143 -0
  21. package/dist/src/BulkOp.js.map +1 -0
  22. package/dist/src/Collection.d.ts +232 -0
  23. package/dist/src/Collection.d.ts.map +1 -0
  24. package/dist/src/Collection.js +705 -0
  25. package/dist/src/Collection.js.map +1 -0
  26. package/dist/src/Cursor.d.ts +94 -0
  27. package/dist/src/Cursor.d.ts.map +1 -0
  28. package/dist/src/Cursor.js +259 -0
  29. package/dist/src/Cursor.js.map +1 -0
  30. package/dist/src/Database.d.ts +98 -0
  31. package/dist/src/Database.d.ts.map +1 -0
  32. package/dist/src/Database.js +198 -0
  33. package/dist/src/Database.js.map +1 -0
  34. package/dist/src/Operators.d.ts +73 -0
  35. package/dist/src/Operators.d.ts.map +1 -0
  36. package/dist/src/Operators.js +339 -0
  37. package/dist/src/Operators.js.map +1 -0
  38. package/dist/src/QueryCache.d.ts +87 -0
  39. package/dist/src/QueryCache.d.ts.map +1 -0
  40. package/dist/src/QueryCache.js +155 -0
  41. package/dist/src/QueryCache.js.map +1 -0
  42. package/dist/src/SQLExecutor.d.ts +60 -0
  43. package/dist/src/SQLExecutor.d.ts.map +1 -0
  44. package/dist/src/SQLExecutor.js +317 -0
  45. package/dist/src/SQLExecutor.js.map +1 -0
  46. package/dist/src/SQLParser.d.ts +181 -0
  47. package/dist/src/SQLParser.d.ts.map +1 -0
  48. package/dist/src/SQLParser.js +640 -0
  49. package/dist/src/SQLParser.js.map +1 -0
  50. package/dist/src/Schema.d.ts +92 -0
  51. package/dist/src/Schema.d.ts.map +1 -0
  52. package/dist/src/Schema.js +253 -0
  53. package/dist/src/Schema.js.map +1 -0
  54. package/dist/src/Transaction.d.ts +118 -0
  55. package/dist/src/Transaction.d.ts.map +1 -0
  56. package/dist/src/Transaction.js +233 -0
  57. package/dist/src/Transaction.js.map +1 -0
  58. package/dist/src/Utils.d.ts +68 -0
  59. package/dist/src/Utils.d.ts.map +1 -0
  60. package/dist/src/Utils.js +187 -0
  61. package/dist/src/Utils.js.map +1 -0
  62. package/dist/src/errors.d.ts +58 -0
  63. package/dist/src/errors.d.ts.map +1 -0
  64. package/dist/src/errors.js +85 -0
  65. package/dist/src/errors.js.map +1 -0
  66. package/dist/src/index.d.ts +39 -0
  67. package/dist/src/index.d.ts.map +1 -0
  68. package/dist/src/index.js +44 -0
  69. package/dist/src/index.js.map +1 -0
  70. package/dist/test/basic.test.d.ts +5 -0
  71. package/dist/test/basic.test.d.ts.map +1 -0
  72. package/dist/test/basic.test.js +283 -0
  73. package/dist/test/basic.test.js.map +1 -0
  74. package/dist/test/index.test.d.ts +5 -0
  75. package/dist/test/index.test.d.ts.map +1 -0
  76. package/dist/test/index.test.js +126 -0
  77. package/dist/test/index.test.js.map +1 -0
  78. package/dist/test/jsonb.test.d.ts +5 -0
  79. package/dist/test/jsonb.test.d.ts.map +1 -0
  80. package/dist/test/jsonb.test.js +165 -0
  81. package/dist/test/jsonb.test.js.map +1 -0
  82. package/dist/test/optimization.test.d.ts +6 -0
  83. package/dist/test/optimization.test.d.ts.map +1 -0
  84. package/dist/test/optimization.test.js +196 -0
  85. package/dist/test/optimization.test.js.map +1 -0
  86. package/dist/test/schema.test.d.ts +5 -0
  87. package/dist/test/schema.test.d.ts.map +1 -0
  88. package/dist/test/schema.test.js +197 -0
  89. package/dist/test/schema.test.js.map +1 -0
  90. package/dist/test/sql.test.d.ts +7 -0
  91. package/dist/test/sql.test.d.ts.map +1 -0
  92. package/dist/test/sql.test.js +21 -0
  93. package/dist/test/sql.test.js.map +1 -0
  94. package/package.json +73 -0
  95. package/src/BulkOp.js +181 -0
  96. package/src/BulkOp.ts +191 -0
  97. package/src/Collection.js +843 -0
  98. package/src/Collection.ts +896 -0
  99. package/src/Cursor.js +315 -0
  100. package/src/Cursor.ts +319 -0
  101. package/src/Database.js +244 -0
  102. package/src/Database.ts +268 -0
  103. package/src/Operators.js +382 -0
  104. package/src/Operators.ts +375 -0
  105. package/src/QueryCache.js +190 -0
  106. package/src/QueryCache.ts +208 -0
  107. package/src/SQLExecutor.ts +391 -0
  108. package/src/SQLParser.ts +814 -0
  109. package/src/Schema.js +292 -0
  110. package/src/Schema.ts +317 -0
  111. package/src/Transaction.js +291 -0
  112. package/src/Transaction.ts +313 -0
  113. package/src/Utils.js +205 -0
  114. package/src/Utils.ts +205 -0
  115. package/src/errors.js +93 -0
  116. package/src/errors.ts +93 -0
  117. package/src/index.js +90 -0
  118. package/src/index.ts +106 -0
package/README.md ADDED
@@ -0,0 +1,903 @@
1
+ # JSONDB - 基于 Node.js 的轻量级 JSON 数据库
2
+
3
+ ## 项目概述
4
+
5
+ **JSONDB** 是一个基于 Node.js 实现的轻量级文档型数据库,使用 JSON 文件作为存储介质,提供类似 MongoDB 的查询语法和操作接口。适合小型项目、原型开发、测试环境和本地应用。
6
+
7
+ ### 核心特点
8
+
9
+ - 📦 **零依赖部署** - 无需安装数据库服务器,开箱即用
10
+ - 📝 **JSON 存储** - 数据以 JSON 格式持久化到本地文件
11
+ - 🔧 **MongoDB 风格语法** - 熟悉的查询和操作方式,学习成本低
12
+ - 🚀 **轻量快速** - 适合小型项目和本地开发
13
+ - 🔍 **丰富查询** - 支持条件查询、排序、分页、聚合等
14
+ - 📊 **索引支持** - 可选的索引机制提升查询性能
15
+
16
+ ---
17
+
18
+ ## 快速开始
19
+
20
+ ### 安装
21
+
22
+ ```bash
23
+ npm install
24
+ ```
25
+
26
+ ### 基本使用
27
+
28
+ ```javascript
29
+ import { Database } from 'jsondb';
30
+
31
+ async function main() {
32
+ // 连接数据库(普通模式)
33
+ const db = new Database('./temp/mydb');
34
+ await db.open();
35
+
36
+ // 连接数据库(JSONB 模式 - 更节省空间)
37
+ const jsonbDb = new Database('./temp/mydb-jsonb', { jsonb: true });
38
+ await jsonbDb.open();
39
+
40
+ // 获取集合
41
+ const users = db.collection('users');
42
+
43
+ // 插入文档
44
+ const user = await users.insertOne({
45
+ name: 'Alice',
46
+ age: 25,
47
+ email: 'alice@example.com'
48
+ });
49
+
50
+ // 查询
51
+ const allUsers = await users.find().toArray();
52
+ const youngUsers = await users.find({ age: { $lt: 30 } }).toArray();
53
+
54
+ // 更新
55
+ await users.updateOne(
56
+ { name: 'Alice' },
57
+ { $set: { age: 26 } }
58
+ );
59
+
60
+ // 删除
61
+ await users.deleteOne({ name: 'Alice' });
62
+
63
+ // 使用 for await...of 遍历
64
+ for await (const user of users.find().limit(5)) {
65
+ console.log(user.name);
66
+ }
67
+
68
+ // 关闭连接
69
+ await db.close();
70
+ }
71
+
72
+ main().catch(console.error);
73
+ ```
74
+
75
+ ### SQL 查询支持
76
+
77
+ JSONDB 支持标准 SQL 语法子集,可以直接使用 SQL 进行增删改查操作:
78
+
79
+ ```javascript
80
+ import { Database } from 'jsondb';
81
+
82
+ const db = new Database('./temp/mydb');
83
+ await db.open();
84
+
85
+ const users = db.collection('users');
86
+
87
+ // INSERT - 插入数据
88
+ await users.sql("INSERT INTO users (name, age, email) VALUES ('Alice', 25, 'alice@example.com')");
89
+
90
+ // 批量插入
91
+ await users.sql(`
92
+ INSERT INTO users (name, age, email) VALUES
93
+ ('Bob', 30, 'bob@example.com'),
94
+ ('Charlie', 28, 'charlie@example.com')
95
+ `);
96
+
97
+ // SELECT - 查询数据
98
+ const result = await users.sql('SELECT * FROM users WHERE age > 25');
99
+ console.log(result.data); // 查询结果
100
+
101
+ // 多条件查询
102
+ const complex = await users.sql(`
103
+ SELECT name, age, department
104
+ FROM users
105
+ WHERE department IN ('Engineering', 'Sales')
106
+ AND age BETWEEN 25 AND 30
107
+ ORDER BY age DESC
108
+ LIMIT 10
109
+ `);
110
+
111
+ // UPDATE - 更新数据
112
+ await users.sql("UPDATE users SET age = 26 WHERE name = 'Alice'");
113
+
114
+ // DELETE - 删除数据
115
+ await users.sql("DELETE FROM users WHERE age < 25");
116
+
117
+ await db.close();
118
+ ```
119
+
120
+ **支持的 SQL 语法:**
121
+
122
+ | 类型 | 语法 | 示例 |
123
+ |------|------|------|
124
+ | SELECT | 查询数据 | `SELECT * FROM users WHERE age > 25` |
125
+ | INSERT | 插入数据 | `INSERT INTO users (name, age) VALUES ('Alice', 25)` |
126
+ | UPDATE | 更新数据 | `UPDATE users SET age = 26 WHERE name = 'Alice'` |
127
+ | DELETE | 删除数据 | `DELETE FROM users WHERE age < 25` |
128
+ | WHERE | 条件过滤 | `WHERE age > 25 AND department = 'Engineering'` |
129
+ | ORDER BY | 排序 | `ORDER BY age DESC` |
130
+ | LIMIT | 限制数量 | `LIMIT 10` |
131
+ | OFFSET | 跳过数量 | `OFFSET 5` |
132
+ | DISTINCT | 去重 | `SELECT DISTINCT department FROM users` |
133
+ | LIKE | 模糊匹配 | `WHERE email LIKE '%@example.com'` |
134
+ | IN | 范围匹配 | `WHERE department IN ('A', 'B')` |
135
+ | BETWEEN | 范围匹配 | `WHERE age BETWEEN 25 AND 30` |
136
+
137
+ **比较操作符:** `=`, `!=`, `<>`, `<`, `<=`, `>`, `>=`
138
+
139
+ **逻辑操作符:** `AND`, `OR`
140
+
141
+ **运行 SQL 示例:**
142
+ ```bash
143
+ node dist/examples/sql-example.js
144
+ ```
145
+
146
+ ### JSONB 模式
147
+
148
+ JSONB(JSON Binary)模式使用二进制格式存储数据,适合对存储空间和 I/O 性能敏感的场景:
149
+
150
+ ```javascript
151
+ // 启用 JSONB 模式
152
+ const db = new Database('./temp/mydb', { jsonb: true });
153
+
154
+ // 查看统计信息
155
+ const stats = await db.stats();
156
+ console.log(stats.jsonb); // true
157
+ ```
158
+
159
+ **JSONB 二进制格式:**
160
+ ```
161
+ [4 字节长度 (uint32 BE)][UTF-8 JSON 数据...]
162
+ ```
163
+
164
+ **JSONB 模式特点:**
165
+ - ✅ 二进制存储,无格式化和空格
166
+ - ✅ 4 字节长度前缀,快速验证完整性
167
+ - ✅ 向后兼容普通 JSON 格式
168
+ - ✅ 适合大规模数据存储
169
+ - ✅ 更小的文件体积(约节省 30-40%)
170
+ - ⚠️ 人类不可直接阅读(需要解码)
171
+
172
+ **使用场景:**
173
+ - 生产环境数据存储
174
+ - 大规模数据集
175
+ - 对存储空间敏感的应用
176
+ - 需要快速加载的场景
177
+
178
+ ### 运行示例
179
+
180
+ ```bash
181
+ # 运行基础示例
182
+ npm run example
183
+
184
+ # 运行高级示例
185
+ npm run example:advanced
186
+
187
+ # 运行 JSONB 示例
188
+ npm run example:jsonb
189
+
190
+ # 运行性能测试
191
+ npm run perf
192
+
193
+ # 启动 Web 管理工具
194
+ npm start
195
+ ```
196
+
197
+ ---
198
+
199
+ ## Web 管理工具
200
+
201
+ JSONDB 提供了一个功能完整的 Web 管理工具,可以通过浏览器管理数据库。
202
+
203
+ ### 启动 Web 管理工具
204
+
205
+ ```bash
206
+ npm start
207
+ ```
208
+
209
+ 然后在浏览器中访问:http://127.0.0.1:3000
210
+
211
+ ### 功能特性
212
+
213
+ - 📁 **打开数据库** - 选择包含 JSON/JSONB 文件的文件夹
214
+ - 📊 **集合列表** - 显示所有集合及文档数量
215
+ - 🔍 **查询执行** - 支持 MongoDB 风格查询语法
216
+ - 📥 **数据导出** - 支持导出为 CSV 和 XLSX 格式
217
+ - ➕ **插入文档** - 可视化插入新文档
218
+ - 🔄 **实时刷新** - 刷新集合数据
219
+ - 📄 **格式切换** - 支持 JSON 和 JSONB 格式
220
+ - ⬆️ **上传文件** - 支持上传 JSON/JSONB 文件创建集合
221
+ - 💾 **保存更改** - 下载修改的集合
222
+ - ⬇️ **批量下载** - 下载所有集合(JSON/JSONB 格式)
223
+
224
+ ### 查询语法
225
+
226
+ ```javascript
227
+ // 精确匹配
228
+ { "status": "active" }
229
+
230
+ // 比较操作符
231
+ { "age": { "$gt": 25 } }
232
+ { "salary": { "$gte": 5000, "$lte": 10000 } }
233
+
234
+ // 逻辑操作符
235
+ { "$and": [{ "age": { "$gt": 18 } }, { "status": "active" }] }
236
+ { "$or": [{ "role": "admin" }, { "role": "moderator" }] }
237
+
238
+ // 数组操作符
239
+ { "tags": { "$in": ["javascript", "nodejs"] } }
240
+
241
+ // 正则表达式
242
+ { "name": { "$regex": "^A" } }
243
+
244
+ // 查询所有
245
+ {}
246
+ ```
247
+
248
+ ### 使用截图
249
+
250
+ 1. 打开数据库文件夹
251
+ 2. 选择集合
252
+ 3. 执行查询
253
+ 4. 导出数据
254
+
255
+ ---
256
+
257
+ ## 命令行工具
258
+
259
+ ### 导出工具
260
+
261
+ ```bash
262
+ # 导出单个文件(支持 JSON/JSONB)
263
+ node bin/cli-export.js export <输入文件> <输出文件> [选项]
264
+
265
+ # 从数据库导出集合
266
+ node bin/cli-export.js db <数据库目录> <集合名> <输出文件> [选项]
267
+
268
+ # 列出数据库中的所有集合
269
+ node bin/cli-export.js list <数据库目录>
270
+ ```
271
+
272
+ ### 导入工具
273
+
274
+ ```bash
275
+ # 从 CSV/XLSX/JSON 导入数据
276
+ node bin/cli-import.js import <输入文件> <数据库目录> <集合名> [选项]
277
+
278
+ # 转换文件格式(JSON ↔ JSONB)
279
+ node bin/cli-import.js convert <输入文件> <输出文件> [选项]
280
+ ```
281
+
282
+ ### 选项
283
+
284
+ | 选项 | 说明 | 默认值 |
285
+ |------|------|--------|
286
+ | `-f, --format <format>` | 输入/输出格式 (json, csv, xlsx) | auto |
287
+ | `-p, --pretty` | 格式化 JSON 输出 | false |
288
+ | `-d, --delimiter <char>` | CSV 分隔符 | , |
289
+ | `--no-header` | 不包含 CSV 表头 | false |
290
+ | `--no-flatten` | 不扁平化嵌套对象 | false |
291
+ | `--jsonb` | 使用 JSONB 二进制格式存储 | false |
292
+ | `--to-jsonb` | 转换为 JSONB 格式 | false |
293
+ | `--to-json` | 转换为 JSON 格式 | false |
294
+
295
+ ### 使用示例
296
+
297
+ ```bash
298
+ # ============ 导出 ============
299
+
300
+ # 导出 JSONB 文件为 JSON
301
+ node bin/cli-export.js export data/users.json output/users.json --pretty
302
+
303
+ # 导出为 CSV
304
+ node bin/cli-export.js export data/users.json output/users.csv --format csv
305
+
306
+ # 导出为 XLSX
307
+ node bin/cli-export.js export data/users.json output/users.xlsx --format xlsx
308
+
309
+ # 从数据库导出集合
310
+ node bin/cli-export.js db ./data/mydb users output/users.json --pretty
311
+
312
+ # ============ 导入 ============
313
+
314
+ # 从 CSV 导入(自动检测格式)
315
+ node bin/cli-import.js import users.csv ./data/mydb users
316
+
317
+ # 从 CSV 导入到 JSONB 格式
318
+ node bin/cli-import.js import users.csv ./data/mydb users --jsonb
319
+
320
+ # 从 XLSX 导入
321
+ node bin/cli-import.js import users.xlsx ./data/mydb users --format xlsx
322
+
323
+ # 转换 JSONB 为 JSON
324
+ node bin/cli-import.js convert data/users.json output/users.json --to-json --pretty
325
+
326
+ # 转换 JSON 为 JSONB
327
+ node bin/cli-import.js convert data/users.json output/users.jsonb --to-jsonb
328
+ ```
329
+
330
+ ## 功能需求
331
+
332
+ ### 1. 核心功能
333
+
334
+ #### 1.1 数据库管理
335
+
336
+ - ✅ 创建/打开数据库
337
+ - ✅ 关闭数据库连接
338
+ - ✅ 删除数据库
339
+ - ✅ 列出所有集合
340
+
341
+ #### 1.2 集合(Collection)操作
342
+
343
+ - ✅ 创建集合
344
+ - ✅ 删除集合
345
+ - ✅ 重命名集合
346
+ - ✅ 获取集合统计信息
347
+
348
+ #### 1.3 文档(Document)操作
349
+
350
+ **CRUD 操作:**
351
+ - ✅ **插入** - `insertOne()`, `insertMany()`
352
+ - ✅ **查询** - `find()`, `findOne()`
353
+ - ✅ **更新** - `updateOne()`, `updateMany()`, `replaceOne()`
354
+ - ✅ **删除** - `deleteOne()`, `deleteMany()`
355
+ - ✅ **计数** - `countDocuments()`
356
+ - ✅ **去重** - `distinct()`
357
+
358
+ #### 1.4 查询功能
359
+
360
+ **比较操作符:**
361
+ - `$eq` - 等于
362
+ - `$ne` - 不等于
363
+ - `$gt` - 大于
364
+ - `$gte` - 大于等于
365
+ - `$lt` - 小于
366
+ - `$lte` - 小于等于
367
+
368
+ **逻辑操作符:**
369
+ - `$and` - 与
370
+ - `$or` - 或
371
+ - `$not` - 非
372
+ - `$nor` - 或非
373
+
374
+ **元素操作符:**
375
+ - `$exists` - 字段存在
376
+ - `$type` - 字段类型
377
+
378
+ **数组操作符:**
379
+ - `$in` - 在数组中
380
+ - `$nin` - 不在数组中
381
+ - `$all` - 包含所有
382
+ - `$elemMatch` - 数组元素匹配
383
+ - `$size` - 数组大小
384
+
385
+ **正则表达式:**
386
+ - `$regex` - 正则匹配
387
+ - `$options` - 正则选项
388
+
389
+ #### 1.5 更新操作符
390
+
391
+ **字段操作符:**
392
+ - `$set` - 设置字段
393
+ - `$unset` - 删除字段
394
+ - `$setOnInsert` - 插入时设置
395
+ - `$rename` - 重命名字段
396
+
397
+ **数值操作符:**
398
+ - `$inc` - 自增
399
+ - `$mul` - 自乘
400
+ - `$min` - 最小值
401
+ - `$max` - 最大值
402
+
403
+ **数组操作符:**
404
+ - `$push` - 推入数组
405
+ - `$pop` - 弹出数组
406
+ - `$pull` - 拉出数组
407
+ - `$addToSet` - 添加到集合
408
+ - `$each` - 批量操作
409
+
410
+ #### 1.6 查询选项
411
+
412
+ - ✅ **排序** - `sort()`
413
+ - ✅ **跳过** - `skip()`
414
+ - ✅ **限制** - `limit()`
415
+ - ✅ **投影** - `project()` / 字段选择
416
+ - ✅ **批量大小** - `batchSize()`
417
+
418
+ #### 1.7 聚合管道
419
+
420
+ - ✅ `$match` - 过滤
421
+ - ✅ `$group` - 分组
422
+ - ✅ `$project` - 投影
423
+ - ✅ `$sort` - 排序
424
+ - ✅ `$limit` - 限制
425
+ - ✅ `$skip` - 跳过
426
+ - ✅ `$count` - 计数
427
+ - ✅ `$sum` - 求和
428
+ - ✅ `$avg` - 平均值
429
+ - ✅ `$min` / `$max` - 最小/最大值
430
+ - ✅ `$push` / `$addToSet` - 数组聚合
431
+ - ✅ `$lookup` - 关联查询(可选)
432
+
433
+ ---
434
+
435
+ ## 技术架构
436
+
437
+ ### 目录结构
438
+
439
+ ```sh
440
+ jsondb/
441
+ ├── src/
442
+ │ ├── index.js # 主入口
443
+ │ ├── Database.js # 数据库类
444
+ │ ├── Collection.js # 集合类
445
+ │ ├── Cursor.js # 游标类
446
+ │ ├── Query.js # 查询解析器
447
+ │ ├── Operators.js # 操作符实现
448
+ │ ├── Index.js # 索引管理
449
+ │ ├── Utils.js # 工具函数
450
+ │ └── errors.js # 错误定义
451
+ ├── data/ # 数据存储目录
452
+ │ └── <database>/
453
+ │ ├── _meta.json # 数据库元数据
454
+ │ └── <collection>.json
455
+ ├── test/ # 测试文件
456
+ │ ├── basic.test.js
457
+ │ ├── query.test.js
458
+ │ ├── update.test.js
459
+ │ └── aggregate.test.js
460
+ ├── examples/ # 示例代码
461
+ ├── package.json
462
+ └── README.md
463
+ ```
464
+
465
+ ### 核心类设计
466
+
467
+ #### Database 类
468
+
469
+ ```javascript
470
+ class Database {
471
+ constructor(dbPath)
472
+ open()
473
+ close()
474
+ collection(name)
475
+ createCollection(name, options)
476
+ dropCollection(name)
477
+ listCollections()
478
+ stats()
479
+ }
480
+ ```
481
+
482
+ #### Collection 类
483
+
484
+ ```javascript
485
+ class Collection {
486
+ constructor(db, name)
487
+ insertOne(doc)
488
+ insertMany(docs)
489
+ find(query, options)
490
+ findOne(query, options)
491
+ updateOne(query, update, options)
492
+ updateMany(query, update, options)
493
+ replaceOne(query, doc, options)
494
+ deleteOne(query)
495
+ deleteMany(query)
496
+ countDocuments(query)
497
+ distinct(key, query)
498
+ aggregate(pipeline)
499
+ createIndex(keys, options)
500
+ dropIndex(name)
501
+ listIndexes()
502
+ }
503
+ ```
504
+
505
+ #### Cursor 类
506
+
507
+ ```javascript
508
+ class Cursor {
509
+ constructor(collection, query, options)
510
+ sort(sortSpec)
511
+ skip(count)
512
+ limit(count)
513
+ project(projection)
514
+ next()
515
+ toArray()
516
+ forEach(callback)
517
+ }
518
+ ```
519
+
520
+ ### 数据存储格式
521
+
522
+ #### 数据库元数据 (`_meta.json`)
523
+
524
+ ```json
525
+ {
526
+ "name": "mydb",
527
+ "version": "1.0.0",
528
+ "createdAt": "2026-03-17T00:00:00.000Z",
529
+ "collections": ["users", "posts", "comments"],
530
+ "options": {}
531
+ }
532
+ ```
533
+
534
+ #### 集合数据 (`<collection>.json`)
535
+
536
+ ```json
537
+ {
538
+ "_meta": {
539
+ "name": "users",
540
+ "count": 3,
541
+ "indexes": [{"key": {"_id": 1}, "name": "_id_"}]
542
+ },
543
+ "_indexes": {
544
+ "_id_": { "type": "btree", "data": {} }
545
+ },
546
+ "_documents": [
547
+ {
548
+ "_id": "507f1f77bcf86cd799439011",
549
+ "name": "Alice",
550
+ "age": 25,
551
+ "email": "alice@example.com",
552
+ "createdAt": "2026-03-17T00:00:00.000Z"
553
+ }
554
+ ]
555
+ }
556
+ ```
557
+
558
+ ---
559
+
560
+ ## 使用示例
561
+
562
+ ### 基本使用
563
+
564
+ ```javascript
565
+ import { Database } from 'jsondb';
566
+
567
+ // 连接数据库
568
+ const db = new Database('./data/mydb');
569
+ await db.open();
570
+
571
+ // 获取集合
572
+ const users = db.collection('users');
573
+
574
+ // 插入文档
575
+ await users.insertOne({
576
+ name: 'Alice',
577
+ age: 25,
578
+ email: 'alice@example.com'
579
+ });
580
+
581
+ await users.insertMany([
582
+ { name: 'Bob', age: 30 },
583
+ { name: 'Charlie', age: 28 }
584
+ ]);
585
+
586
+ // 查询
587
+ const allUsers = await users.find().toArray();
588
+ const youngUsers = await users.find({ age: { $lt: 30 } }).toArray();
589
+
590
+ // 更新
591
+ await users.updateOne(
592
+ { name: 'Alice' },
593
+ { $set: { age: 26 } }
594
+ );
595
+
596
+ // 删除
597
+ await users.deleteOne({ name: 'Bob' });
598
+
599
+ // 聚合
600
+ const stats = await users.aggregate([
601
+ { $group: { _id: null, avgAge: { $avg: '$age' } } }
602
+ ]);
603
+
604
+ // 关闭连接
605
+ await db.close();
606
+ ```
607
+
608
+ ### 高级查询
609
+
610
+ ```javascript
611
+ // 复杂条件查询
612
+ const result = await users.find({
613
+ $and: [
614
+ { age: { $gte: 25 } },
615
+ { age: { $lt: 35 } },
616
+ { status: { $in: ['active', 'pending'] } }
617
+ ]
618
+ }).sort({ age: -1 }).limit(10).toArray();
619
+
620
+ // 数组查询
621
+ const posts = await db.collection('posts').find({
622
+ tags: { $all: ['nodejs', 'database'] },
623
+ likes: { $gte: 100 }
624
+ }).toArray();
625
+
626
+ // 正则查询
627
+ const found = await users.find({
628
+ email: { $regex: /@gmail\.com$/, $options: 'i' }
629
+ }).toArray();
630
+ ```
631
+
632
+ ---
633
+
634
+ ## 开发计划
635
+
636
+ ### ✅ Phase 1: 基础框架 (已完成)
637
+
638
+ - [x] 项目初始化
639
+ - [x] Database 类实现
640
+ - [x] Collection 类实现
641
+ - [x] 基本 CRUD 操作
642
+ - [x] 单元测试框架搭建 (Vitest)
643
+ - [x] **TypeScript 迁移** - 完整类型支持
644
+
645
+ ### ✅ Phase 2: 查询引擎 (已完成)
646
+
647
+ - [x] 查询解析器实现
648
+ - [x] 比较操作符 (`$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`)
649
+ - [x] 逻辑操作符 (`$and`, `$or`, `$not`, `$nor`)
650
+ - [x] 数组操作符 (`$in`, `$nin`, `$all`, `$elemMatch`, `$size`)
651
+ - [x] 正则表达式支持 (`$regex`, `$options`)
652
+ - [x] Cursor 类实现 (支持 async iterator)
653
+
654
+ ### ✅ Phase 3: 更新与索引 (已完成)
655
+
656
+ - [x] 更新操作符实现 (`$set`, `$unset`, `$inc`, `$mul`, `$push`, `$pull` 等)
657
+ - [x] 索引机制设计
658
+ - [x] 索引创建与查询优化
659
+ - [x] 性能基准测试
660
+
661
+ ### ✅ Phase 4: 聚合管道 (已完成)
662
+
663
+ - [x] 聚合框架设计
664
+ - [x] 常用管道阶段实现 (`$match`, `$group`, `$project`, `$sort`, `$limit`, `$skip`, `$count`)
665
+ - [x] 表达式系统 (`$sum`, `$avg`, `$min`, `$max`)
666
+ - [x] 完整测试覆盖
667
+
668
+ ### ✅ Phase 5: 优化与完善 (已完成)
669
+
670
+ - [x] 批量操作优化 (`BulkOperation`)
671
+ - [x] 查询缓存 (`QueryCache`)
672
+ - [x] 事务支持 (`Transaction`)
673
+ - [x] Schema 验证
674
+ - [x] JSONB 二进制存储模式
675
+ - [x] 文档完善
676
+ - [x] 示例代码
677
+
678
+ ### 🚀 Phase 6: 工具与生态 (进行中)
679
+
680
+ - [x] Web 管理工具
681
+ - [x] CLI 导出工具 (支持 JSON/CSV/XLSX)
682
+ - [x] CLI 导入工具 (支持 CSV/XLSX/JSON)
683
+ - [x] JSONB 格式转换工具
684
+ - [ ] GUI 管理工具增强
685
+ - [ ] 可视化聚合管道构建器
686
+ - [ ] 查询性能分析工具
687
+ - [ ] 数据导入向导
688
+ - [ ] NPM 包发布
689
+ - [ ] CDN 分发
690
+
691
+ ### 📋 Phase 7: 高级功能 (计划中)
692
+
693
+ - [ ] 全文搜索支持
694
+ - [ ] 地理空间查询
695
+ - [ ] 变更流 (Change Stream)
696
+ - [ ] 视图 (Views)
697
+ - [ ] 存储过程支持
698
+ - [ ] 数据备份与恢复工具
699
+ - [ ] 多数据库连接池
700
+
701
+ ### 🔒 Phase 8: 安全与性能 (计划中)
702
+
703
+ - [ ] 访问控制列表 (ACL)
704
+ - [ ] 数据加密存储
705
+ - [ ] 审计日志
706
+ - [ ] 查询限流
707
+ - [ ] 内存管理优化
708
+ - [ ] 并发写入优化
709
+ - [ ] 增量备份
710
+
711
+ ### 📦 Phase 9: 扩展性 (计划中)
712
+
713
+ - [ ] 插件系统
714
+ - [ ] 自定义操作符
715
+ - [ ] 远程数据库支持
716
+ - [ ] 分布式存储
717
+ - [ ] 数据同步工具
718
+ - [ ] ORM/ODM 集成
719
+
720
+ ---
721
+
722
+ ## 当前状态
723
+
724
+ ### ✅ 已完成功能
725
+
726
+ | 功能模块 | 状态 | 测试覆盖 |
727
+ |---------|------|---------|
728
+ | 核心 CRUD | ✅ 完成 | 100% |
729
+ | 查询操作符 | ✅ 完成 | 100% |
730
+ | 更新操作符 | ✅ 完成 | 100% |
731
+ | 聚合管道 | ✅ 完成 | 95% |
732
+ | 索引支持 | ✅ 完成 | 90% |
733
+ | JSONB 模式 | ✅ 完成 | 100% |
734
+ | Schema 验证 | ✅ 完成 | 100% |
735
+ | 批量操作 | ✅ 完成 | 100% |
736
+ | 事务支持 | ✅ 完成 | 95% |
737
+ | 查询缓存 | ✅ 完成 | 90% |
738
+ | Web 管理工具 | ✅ 完成 | - |
739
+ | CLI 工具 | ✅ 完成 | - |
740
+ | TypeScript | ✅ 完成 | 100% |
741
+
742
+ ### 📊 测试结果
743
+
744
+ ```
745
+ Test Files 5 passed (5)
746
+ Tests 82 passed (82)
747
+ Duration ~1s
748
+ ```
749
+
750
+ ### 📈 性能指标
751
+
752
+ - 批量插入 vs 单条插入:**30x+ 性能提升**
753
+ - 索引查询 vs 全表扫描:**2x+ 性能提升**
754
+ - JSONB 存储 vs JSON 存储:**30-40% 空间节省**
755
+
756
+ ---
757
+
758
+ ## API 参考
759
+
760
+ ### Database 类
761
+
762
+ ```javascript
763
+ const db = new Database('./data/mydb');
764
+
765
+ await db.open(); // 打开数据库
766
+ await db.close(); // 关闭数据库
767
+ await db.drop(); // 删除数据库
768
+
769
+ db.collection(name); // 获取集合(同步)
770
+ await db.createCollection(name); // 创建集合
771
+ await db.dropCollection(name); // 删除集合
772
+ await db.listCollections(); // 列出所有集合
773
+ await db.stats(); // 获取统计信息
774
+ ```
775
+
776
+ ### Collection 类
777
+
778
+ ```javascript
779
+ const collection = db.collection('users');
780
+
781
+ // 插入
782
+ await collection.insertOne(doc);
783
+ await collection.insertMany([docs]);
784
+
785
+ // 查询
786
+ const cursor = collection.find(query); // 返回 Cursor
787
+ const doc = await collection.findOne(query);
788
+
789
+ // 更新
790
+ await collection.updateOne(query, update);
791
+ await collection.updateMany(query, update);
792
+ await collection.replaceOne(query, doc);
793
+
794
+ // 删除
795
+ await collection.deleteOne(query);
796
+ await collection.deleteMany(query);
797
+
798
+ // 统计
799
+ await collection.countDocuments(query);
800
+ await collection.distinct(key, query);
801
+ await collection.aggregate(pipeline);
802
+
803
+ // 索引
804
+ await collection.createIndex(keys);
805
+ await collection.dropIndex(name);
806
+ await collection.listIndexes();
807
+ await collection.stats();
808
+ ```
809
+
810
+ ### Cursor 类
811
+
812
+ ```javascript
813
+ const cursor = collection.find(query)
814
+ .sort({ age: -1 })
815
+ .skip(10)
816
+ .limit(20)
817
+ .project({ name: 1, email: 1 });
818
+
819
+ const results = await cursor.toArray(); // 获取所有结果
820
+ const first = await cursor.first(); // 获取第一个
821
+ const next = await cursor.next(); // 获取下一个
822
+ const count = await cursor.count(); // 获取数量
823
+
824
+ // 遍历
825
+ await cursor.forEach(doc => {
826
+ console.log(doc);
827
+ });
828
+
829
+ // for await...of
830
+ for await (const doc of cursor) {
831
+ console.log(doc.name);
832
+ }
833
+ ```
834
+
835
+ | 操作符 | 说明 | 示例 |
836
+ |--------|------|------|
837
+ | `$eq` | 等于 | `{ age: { $eq: 25 } }` |
838
+ | `$ne` | 不等于 | `{ status: { $ne: 'deleted' } }` |
839
+ | `$gt` | 大于 | `{ price: { $gt: 100 } }` |
840
+ | `$gte` | 大于等于 | `{ score: { $gte: 60 } }` |
841
+ | `$lt` | 小于 | `{ age: { $lt: 18 } }` |
842
+ | `$lte` | 小于等于 | `{ level: { $lte: 5 } }` |
843
+ | `$in` | 在...中 | `{ status: { $in: ['A', 'B'] } }` |
844
+ | `$nin` | 不在...中 | `{ type: { $nin: ['test'] } }` |
845
+ | `$and` | 与 | `{ $and: [{ a: 1 }, { b: 2 }] }` |
846
+ | `$or` | 或 | `{ $or: [{ a: 1 }, { b: 2 }] }` |
847
+ | `$not` | 非 | `{ price: { $not: { $gte: 100 } } }` |
848
+ | `$exists` | 字段存在 | `{ phone: { $exists: true } }` |
849
+ | `$regex` | 正则 | `{ name: { $regex: /^A/ } }` |
850
+ | `$all` | 数组包含所有 | `{ tags: { $all: ['a', 'b'] } }` |
851
+ | `$size` | 数组大小 | `{ comments: { $size: 5 } }` |
852
+ | `$elemMatch` | 数组元素匹配 | `{ scores: { $elemMatch: { $gte: 80 } } }` |
853
+
854
+ ### 更新操作符
855
+
856
+ | 操作符 | 说明 | 示例 |
857
+ |--------|------|------|
858
+ | `$set` | 设置字段 | `{ $set: { status: 'active' } }` |
859
+ | `$unset` | 删除字段 | `{ $unset: { temp: '' } }` |
860
+ | `$inc` | 自增 | `{ $inc: { views: 1 } }` |
861
+ | `$mul` | 自乘 | `{ $mul: { price: 0.8 } }` |
862
+ | `$push` | 推入数组 | `{ $push: { tags: 'new' } }` |
863
+ | `$pull` | 拉出数组 | `{ $pull: { tags: 'old' } }` |
864
+ | `$addToSet` | 添加到集合 | `{ $addToSet: { colors: 'red' } }` |
865
+ | `$pop` | 弹出数组 | `{ $pop: { items: 1 } }` |
866
+
867
+ ### 聚合管道
868
+
869
+ | 阶段 | 说明 |
870
+ |------|------|
871
+ | `$match` | 过滤文档 |
872
+ | `$group` | 分组聚合 |
873
+ | `$project` | 重塑文档 |
874
+ | `$sort` | 排序 |
875
+ | `$limit` | 限制数量 |
876
+ | `$skip` | 跳过数量 |
877
+ | `$count` | 计数 |
878
+ | `$lookup` | 关联查询 |
879
+ | `$unwind` | 展开数组 |
880
+
881
+ ---
882
+
883
+ ## 技术栈
884
+
885
+ - **运行时**: Node.js >= 18
886
+ - **语言**: JavaScript (ES Modules)
887
+ - **测试**: Vitest / Jest
888
+ - **代码质量**: ESLint + Prettier
889
+ - **文档**: Markdown
890
+ - **包管理**: npm / pnpm
891
+
892
+ ---
893
+
894
+ ## 许可证
895
+
896
+ MIT License
897
+
898
+ ---
899
+
900
+ ## 相关链接
901
+
902
+ - [MongoDB 查询文档](https://docs.mongodb.com/manual/reference/operator/query/)
903
+ - [Node.js 官方文档](https://nodejs.org/)