@@ -229,8 +229,8 @@ const users = await collection.find({
229229
230230## �️ 文档导航
231231
232- ### 📚 核心概念(7 篇)
233- [ 连接管理] ( ./docs/connection.md ) · [ 缓存系统] ( ./docs/cache.md ) · [ 事务管理] ( ./docs/transaction.md ) · [ Model 层] ( ./docs/model.md ) · [ 业务锁] ( ./docs/business-lock.md ) · [ SSH 隧道] ( ./docs/ssh-tunnel.md ) · [ 分布式部署] ( ./docs/distributed-deployment.md )
232+ ### 📚 核心概念(8 篇)
233+ [ 连接管理] ( ./docs/connection.md ) · [ ObjectId 自动转换 ] ( ./docs/objectid-auto-convert.md ) 🆕 · [ 缓存系统] ( ./docs/cache.md ) · [ 事务管理] ( ./docs/transaction.md ) · [ Model 层] ( ./docs/model.md ) · [ 业务锁] ( ./docs/business-lock.md ) · [ SSH 隧道] ( ./docs/ssh-tunnel.md ) · [ 分布式部署] ( ./docs/distributed-deployment.md )
234234
235235### 🔍 查询操作(8 篇)
236236[ find] ( ./docs/find.md ) · [ findOne] ( ./docs/findOne.md ) · [ findOneById] ( ./docs/find-one-by-id.md ) · [ findByIds] ( ./docs/find-by-ids.md ) · [ findPage] ( ./docs/findPage.md ) · [ count] ( ./docs/count.md ) · [ distinct] ( ./docs/distinct.md ) · [ watch] ( ./docs/watch.md ) ⭐
@@ -301,7 +301,7 @@ await msq.close();
301301
302302### 使用 Model 层(可选)
303303
304- 如果需要 ** Populate关联查询** 、** Hooks生命周期** 等 ORM 特性,可以使用 Model 层:
304+ 如果需要 ** Schema验证 ** 、 ** Populate关联查询** 、** Hooks生命周期** 等 ORM 特性,可以使用 Model 层:
305305
306306``` javascript
307307const MonSQLize = require (' monsqlize' );
@@ -311,14 +311,24 @@ const msq = new MonSQLize({
311311 type: ' mongodb' ,
312312 databaseName: ' mydb' ,
313313 config: { uri: ' mongodb://localhost:27017' },
314- cache: { enabled: true }
314+ cache: { enabled: true },
315+ models: ' ./models' // 🆕 v1.0.7: 自动加载 Model 文件
315316});
316317
317- await msq .connect ();
318+ await msq .connect (); // 自动加载 models/*.model.js
318319
319- // 1. 定义 Model(带 Relations 和 Hooks)
320+ // 1. 定义 Model(带 Schema 验证、 Relations 和 Hooks)
320321Model .define (' users' , {
321- schema : () => ({}), // 空 schema(如需验证可使用 schema-dsl)
322+ // 🔴 Schema 验证(默认启用,v1.0.7+)
323+ schema : (dsl ) => dsl ({
324+ username: ' string:3-32!' , // 必需,3-32 字符
325+ email: ' email!' , // 必需,邮箱格式
326+ password: ' string:6-!' , // 必需,至少 6 字符
327+ age: ' number:0-120' , // 可选,0-120 范围
328+ role: ' string?' // 可选字符串
329+ }),
330+
331+ // Relations(关联查询)
322332 relations: {
323333 posts: { // 用户的文章
324334 from: ' posts' ,
@@ -327,45 +337,92 @@ Model.define('users', {
327337 single: false
328338 }
329339 },
340+
341+ // Hooks(生命周期钩子)
330342 hooks : (model ) => ({
331343 insert: {
332344 before: async (ctx , doc ) => {
333345 doc .createdAt = new Date (); // 自动添加时间戳
334346 return doc;
335347 }
336348 }
349+ }),
350+
351+ // 自定义方法
352+ methods : (model ) => ({
353+ instance: {
354+ // 文档方法(注入到查询结果)
355+ checkPassword (password ) {
356+ return this .password === password;
357+ }
358+ },
359+ static: {
360+ // Model 方法
361+ async findByUsername (username ) {
362+ return await model .findOne ({ username });
363+ }
364+ }
337365 })
338366});
339367
340368Model .define (' posts' , {
341- schema : () => ({}) // 文章 Model
369+ schema : (dsl ) => dsl ({
370+ title: ' string:1-200!' ,
371+ content: ' string!' ,
372+ userId: ' string!'
373+ })
342374});
343375
344376// 2. 使用 Model
345377const User = msq .model (' users' );
346378
347- // Hooks 自动执行
379+ // ✅ Schema 验证自动生效
380+ try {
381+ await User .insertOne ({
382+ username: ' jo' , // ❌ 太短,验证失败
383+ email: ' invalid-email' , // ❌ 邮箱格式错误
384+ age: 25
385+ });
386+ } catch (err) {
387+ console .error (err .code ); // 'VALIDATION_ERROR'
388+ console .error (err .errors ); // 详细的验证错误
389+ }
390+
391+ // ✅ 正确的数据
348392const user = await User .insertOne ({
349393 username: ' john' ,
350394 email: ' john@example.com' ,
395+ password: ' secret123' ,
351396 age: 25
352397 // createdAt 由 hook 自动添加
353398});
354399
400+ // 使用自定义方法
401+ const foundUser = await User .findByUsername (' john' );
402+ if (foundUser .checkPassword (' secret123' )) {
403+ console .log (' 登录成功' );
404+ }
405+
355406// Populate 关联查询(自动填充用户的文章)
356407const userWithPosts = await User .findOne ({ username: ' john' })
357408 .populate (' posts' );
358409
359410console .log (userWithPosts .posts ); // [{ title: '...', content: '...' }, ...]
411+
412+ // 禁用验证(特殊场景)
413+ await User .insertOne (doc, { skipValidation: true });
360414```
361415
362416** Model 层特性** :
417+ - ✅ ** Schema 验证** - 自动验证数据格式(v1.0.7 默认启用)
418+ - ✅ ** 自动加载** - 扫描目录自动加载 Model 文件(v1.0.7+)
363419- ✅ ** Populate** - 关联查询,支持 6 个方法(业界领先)
364420- ✅ ** Hooks** - 生命周期钩子(insert/update/delete/find)
365421- ✅ ** Relations** - 定义表关系(hasOne/hasMany/belongsTo)
422+ - ✅ ** 自定义方法** - instance 方法注入到文档,static 方法挂载到 Model
366423- ✅ ** 自动缓存** - Populate 查询结果也会缓存
367424
368- 📖 ** 详细文档** :[ Model 层完整指南] ( ./docs/model.md ) | [ Populate API] ( ./docs/populate.md ) | [ Hooks API] ( ./docs/hooks.md )
425+ 📖 ** 详细文档** :[ Model 层完整指南] ( ./docs/model.md ) | [ Populate API] ( ./docs/populate.md ) | [ Hooks API] ( ./docs/hooks.md ) | [ Schema 验证 ] ( ./docs/model.md#schema-验证 )
369426
370427---
371428
0 commit comments