|
8 | 8 | - [快速开始](#quick-start) |
9 | 9 | - [深度分页(聚合版,Mongo)](#deep-pagination-agg) |
10 | 10 | - [统一 findPage:游标 + 跳页 + offset + totals](#findpage-unified) |
| 11 | +- [返回耗时(meta)](#返回耗时meta) |
11 | 12 | - [缓存与失效](#cache) |
12 | 13 | - [缓存配置](#缓存配置) |
13 | 14 | - [缓存行为与细节](#缓存行为与细节) |
|
16 | 17 | - [invalidate(op) 用法](#invalidate) |
17 | 18 | - [跨库访问注意事项](#cross-db) |
18 | 19 | - [说明](#notes) |
| 20 | +- [事件(Mongo)](#事件mongo) |
| 21 | +- [健康检查与事件(Mongo)](#健康检查与事件mongo) |
19 | 22 |
|
20 | 23 | <a id='status'></a> |
21 | 24 | ## 状态(速览) |
@@ -566,6 +569,53 @@ const msq = await new MonSQLize({ |
566 | 569 | 提示:也可在上层自行构建 MultiLevelCache 并作为 `cache` 直接注入(需 `require('monsqlize/lib/multi-level-cache')`)。 |
567 | 570 |
|
568 | 571 |
|
| 572 | +## 返回耗时(meta) |
| 573 | +- 支持在所有读 API 上按次返回耗时与元信息(opt-in,不改默认返回类型)。 |
| 574 | +- 使用方法:在 options 中传入 `meta: true` 或 `meta: { level: 'sub', includeCache: true }`。 |
| 575 | + - findOne/find/count/find:当 `meta` 为真时返回 `{ data, meta }`;不传则维持原返回(对象/数组/数字)。 |
| 576 | + - findPage:当 `meta` 为真时在返回对象上附加 `meta` 字段;`level:'sub'` 时返回每个 hop/offset 的子步骤耗时。 |
| 577 | + |
| 578 | +示例: |
| 579 | +```js |
| 580 | +// 单条查询:返回耗时 |
| 581 | +const { data, meta } = await coll.findOne({ query:{ name: 'Alice' }, cache: 2000, maxTimeMS: 1500, meta: true }); |
| 582 | +console.log(meta.durationMs); |
| 583 | + |
| 584 | +// 分页:总耗时 |
| 585 | +const page = await coll.findPage({ query:{ status:'paid' }, sort:{ createdAt:-1,_id:1 }, limit:20, page:37, meta:true }); |
| 586 | +console.log(page.meta.durationMs); |
| 587 | + |
| 588 | +// 分页:子步骤耗时(跳页时可见每个 hop 的耗时) |
| 589 | +const page2 = await coll.findPage({ query:{ status:'paid' }, sort:{ createdAt:-1,_id:1 }, limit:20, page:128, jump:{ step:20 }, meta:{ level:'sub', includeCache:true } }); |
| 590 | +console.table(page2.meta.steps); |
| 591 | +``` |
| 592 | + |
| 593 | +> 说明: |
| 594 | +> - 默认不返回 meta,需显式开启;开销很小,仅一次时间戳与对象组装。 |
| 595 | +> - includeCache 仅包含去敏维度(如 cacheTtl 等,具体依实现)。 |
| 596 | +
|
| 597 | +## 事件(Mongo) |
| 598 | +- 事件基于 Node.js EventEmitter,进程内有效: |
| 599 | + - `connected`: `{ type, db, scope, iid? }` |
| 600 | + - `closed`: `{ type, db, iid? }` |
| 601 | + - `error`: `{ type, db, error, iid? }` |
| 602 | + - `slow-query`: `{ op, ns, durationMs, startTs, endTs, maxTimeMS, ... }`(去敏) |
| 603 | + - `query`(可选):每次读操作完成后触发;需在构造 defaults 中开启 `metrics.emitQueryEvent=true`。 |
| 604 | +- 实例还暴露:`on/off/once/emit`。 |
| 605 | + |
| 606 | +用法示例: |
| 607 | +```js |
| 608 | +const msq = new MonSQLize({ type:'mongodb', databaseName:'example', config:{ uri:'mongodb://localhost:27017' }, defaults:{ metrics:{ emitQueryEvent:false } } }); |
| 609 | +msq.on('connected', info => console.log('[connected]', info)); |
| 610 | +msq.on('closed', info => console.log('[closed]', info)); |
| 611 | +msq.on('error', info => console.error('[error]', info)); |
| 612 | +msq.on('slow-query', meta => console.warn('[slow-query]', meta)); |
| 613 | +// 可选:开启 query 事件 |
| 614 | +// const msq = new MonSQLize({ ..., defaults:{ metrics:{ emitQueryEvent:true } } }); |
| 615 | +msq.on('query', meta => console.log('[query]', meta)); |
| 616 | +await msq.connect(); |
| 617 | +``` |
| 618 | + |
569 | 619 | ## 健康检查与事件(Mongo) |
570 | 620 | - 健康检查:`await msq.health()` 返回 `{ status: 'up'|'down', connected, defaults, cache?, driver }` 摘要视图。 |
571 | 621 | - 事件钩子: |
|
0 commit comments