100% API 兼容 · 零学习成本 · 开箱即用
npm install monsqlize// ❌ MongoDB 原生驱动
const users = await collection.find({ status: 'active' }).toArray(); // 50ms
const product = await products.findOne({ _id: productId }); // 10ms
// ✅ monSQLize(启用缓存)
const users = await collection.find({ status: 'active' }, { cache: 60000 }); // 0.5ms ⚡ 100x faster
const product = await products.findOne({ _id: productId }, { cache: 60000 }); // 0.1ms ⚡ 100x faster只需在初始化时配置缓存,业务代码一行不改,性能立即提升!
monSQLize 是一个100% 兼容 MongoDB API 的增强库。
在保持完全兼容的前提下,为你的应用提供:
|
LRU/TTL 策略 |
自动管理 |
Redis 广播 |
设计理念:零学习成本 · 渐进式采用 · 性能优先 · 生产可靠
|
😫 数据库性能瓶颈
😫 代码重复繁琐
😫 多实例部署问题
|
✅ monSQLize 的解决方案
✅ monSQLize 的解决方案
✅ monSQLize 的解决方案
|
| 场景 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 商品详情页 | 50ms/次 | 0.5ms/次 | 100x ⚡ |
| 用户列表 | 80ms/次 | 0.8ms/次 | 100x ⚡ |
| 订单统计 | 200ms/次 | 2ms/次 | 100x ⚡ |
| 批量插入 10万条 | 30s | 1.2s | 25x ⚡ |
缓存命中率:电商 85% · 内容平台 75% · 社交应用 80%
| 场景 | 说明 | 预期效果 |
|---|---|---|
| 高并发读取 | 商品详情、用户信息等热点数据 | 缓存命中率 70 |
| 复杂查询 | 聚合统计、关联查询 | 重复查询直接走缓存,避免重复计算 |
| 多实例部署 | 负载均衡、水平扩展 | Redis 广播保证缓存一致性 |
| 事务密集 | 订单、支付等业务 | 自动管理事务,优化只读操作 |
| 并发控制 | 库存扣减、定时任务 | 分布式锁解决复杂并发场景 |
| 场景 | 原因 | 建议 |
|---|---|---|
| 纯写入应用 | 大量写入,很少查询 | 缓存作用有限,使用原生驱动即可 |
| 实时性要求极高 | 必须每次查询最新数据 | 不启用缓存,或使用极短 TTL |
| 简单 CRUD | 简单应用,流量不大 | 原生驱动足够,无需引入复杂度 |
| 内存受限 | 服务器内存紧张 | 缓存会占用额外内存 |
- 渐进式采用:先在热点查询启用缓存,观察效果后逐步扩展
- 监控指标:关注缓存命中率、内存使用、慢查询日志
- 合理配置:根据业务特点调整 TTL、缓存大小
- 混合使用:可与原生驱动混用,性能敏感用 monSQLize,简单查询用原生
npm install monsqlizeconst MonSQLize = require('monsqlize');
// 1. 初始化
const db = new MonSQLize({
type: 'mongodb',
config: { uri: 'mongodb://localhost:27017/mydb' },
cache: {
enabled: true,
maxSize: 100000, // 最多缓存 10 万条
ttl: 60000 // 默认 TTL 60 秒
}
});
await db.connect();
// 2. 使用(完全兼容 MongoDB API)
const users = db.collection('users');
// 启用缓存
const user = await users.findOne({ email }, { cache: 60000 });
// 写操作自动失效缓存
await users.updateOne({ email }, { $set: { lastLogin: new Date() } });
// 便利方法
const user = await users.findOneById(userId);
const list = await users.findByIds([id1, id2, id3]);
// 事务
await db.withTransaction(async (tx) => {
await users.updateOne({...}, {...}, { session: tx.session });
await orders.insertOne({...}, { session: tx.session });
});
// 业务锁(v1.4.0)
await db.withLock('resource:key', async () => {
// 临界区代码
});// 原来的代码
const { MongoClient } = require('mongodb');
const client = await MongoClient.connect('mongodb://localhost:27017');
const db = client.db('mydb');
const users = db.collection('users');
// 迁移后(只需改初始化)
const MonSQLize = require('monsqlize');
const db = new MonSQLize({
type: 'mongodb',
config: { uri: 'mongodb://localhost:27017/mydb' },
cache: { enabled: true } // 启用缓存
});
await db.connect();
const users = db.collection('users');
// ✅ 后续代码完全不变
const user = await users.findOne({ email });|
特性
|
性能提升
|
// 一行代码启用缓存
const users = await collection.find({ status: 'active' }, { cache: 60000 });// 自动管理事务生命周期
await db.withTransaction(async (tx) => {
// 只读操作会被优化(不加锁,减少 30% 访问)
const user = await users.findOne({ _id: userId }, { session: tx.session });
// 写操作自动加锁
await users.updateOne({ _id: userId }, { $inc: { balance: -100 } }, { session: tx.session });
// 自动提交 or 回滚
});|
❌ 原生驱动 // 查询单个文档(需要手动转换 ObjectId)
const { ObjectId } = require('mongodb');
const user = await users.findOne({
_id: new ObjectId(userId)
});
// 批量查询(需要手动构建 $in)
const userList = await users.find({
_id: { $in: ids.map(id => new ObjectId(id)) }
}).toArray();
// Upsert(需要手动设置选项)
await users.updateOne(
{ email: 'alice@example.com' },
{ $set: { name: 'Alice', age: 30 } },
{ upsert: true }
); |
✅ monSQLize // 查询单个文档(自动转换)
const user = await users.findOneById(userId);
// 批量查询(一行搞定)
const userList = await users.findByIds(ids);
// Upsert(语义化)
await users.upsertOne(
{ email: 'alice@example.com' },
{ name: 'Alice', age: 30 }
);代码减少 60~80%! |
// 多实例部署,Redis 自动同步缓存
const db = new MonSQLize({
cache: {
distributed: {
enabled: true,
redis: redisInstance // 使用 Redis 广播缓存失效
}
}
});
// 实例 A 更新数据
await users.updateOne({ _id: userId }, { $set: { name: 'Bob' } });
// ⚡ 实例 B/C/D 的缓存自动失效// 🔥 解决复杂业务场景的并发问题
// 场景1:库存扣减
await db.withLock(`inventory:${sku}`, async () => {
const product = await inventory.findOne({ sku });
const price = calculatePrice(product, user, coupon); // 复杂计算
if (user.balance < price) throw new Error('余额不足');
await inventory.updateOne({ sku }, { $inc: { stock: -1 } });
await users.updateOne({ userId }, { $inc: { balance: -price } });
await orders.insertOne({ userId, sku, price });
});
// 场景2:定时任务防重(多实例环境)
const lock = await db.tryAcquireLock('cron:daily-report');
if (lock) {
try {
await generateDailyReport(); // 只有一个实例执行
} finally {
await lock.release();
}
}特性:基于 Redis · 自动重试 · TTL 防死锁 · 支持续期 · 降级策略
// 批量插入 10 万条数据
await users.insertBatch(documents, {
batchSize: 1000, // 每批 1000 条
retryTimes: 3, // 失败重试 3 次
onProgress: (stats) => {
console.log(`进度: ${stats.inserted}/${stats.total}`);
}
});性能: 比原生 insertMany 快 10~50 倍 ⚡
// 千万级数据分页(游标分页,性能稳定)
const result = await users.findPage({
query: { status: 'active' },
page: 1000, // 第 1000 页
limit: 20,
totals: {
mode: 'async', // 异步统计总数
ttl: 300000 // 缓存 5 分钟
}
});
console.log(`总计: ${result.totals.total}, 共 ${result.totals.totalPages} 页`);// 🆕 慢查询日志持久化存储(v1.3+)
const msq = new MonSQLize({
type: 'mongodb',
config: { uri: 'mongodb://localhost:27017/mydb' },
slowQueryMs: 500,
slowQueryLog: true // ✅ 零配置启用,自动存储到 admin.slow_query_logs
});
await msq.connect();
// 查询慢查询日志(支持去重聚合)
const logs = await msq.getSlowQueryLogs(
{ collection: 'users' },
{ sort: { count: -1 }, limit: 10 } // 查询高频慢查询Top10
);
// [{ queryHash: 'abc123', count: 2400, avgTimeMs: 520, maxTimeMs: 1200, ... }]
// 自动记录慢查询(原有功能)
// [WARN] Slow query { ns: 'mydb.users', duration: 1200ms, query: {...} }
// 健康检查
const health = await db.health();
// { status: 'ok', uptime: 3600, connections: 10 }
// 性能指标
const stats = await db.getStats();
// { queries: 10000, cacheHits: 9000, hitRate: 0.9 }- CPU: Intel i7-9700K
- 内存: 16GB
- 数据库: MongoDB 5.0
- 数据量: 100 万条
| 场景 | 原生驱动 | monSQLize (缓存) | 提升倍数 |
|---|---|---|---|
| 热点查询 (findOne) | 10ms | 0.1ms | 100x ⚡ |
| 列表查询 (find) | 50ms | 0.5ms | 100x ⚡ |
| 复杂聚合 (aggregate) | 200ms | 2ms | 100x ⚡ |
| 批量插入 (10万条) | 30s | 1.2s | 25x ⚡ |
- 电商场景: 85% (商品/用户查询)
- 内容平台: 75% (文章/评论查询)
- 社交应用: 80% (个人资料/动态)
结论: 在真实业务场景中,缓存命中率通常在 70~90%,性能提升 10~100 倍。
|
✅ CRUD 操作
✅ 聚合 & 查询
✅ 索引管理
✅ 事务支持
|
✅ 智能缓存
✅ 便利方法
✅ 性能优化
✅ 分布式支持
|
✅ 运维监控
✅ 深度分页
✅ 数据库管理
✅ 开发体验
|
| 特性 | MongoDB 原生 | monSQLize |
|---|---|---|
| API 兼容性 | ✅ 原生 | ✅ 100% 兼容原生,无需学习新 API |
| 智能缓存 | ❌ 需要自己实现 | ✅ 内置 TTL/LRU,开箱即用,10~100倍提升 |
| 性能 | ⭐⭐⭐ 基准性能 | ⭐⭐⭐⭐⭐ 缓存命中时性能提升 10~100 倍 |
| 事务支持 | ⭐⭐ 需要手动管理 | ⭐⭐⭐⭐⭐ 自动管理生命周期,优化只读操作 |
| 分布式部署 | ❌ 缓存不一致 | ✅ Redis 广播自动同步,保证一致性 |
| 便利方法 | ❌ 需要自己封装 | ✅ findOneById、findByIds、upsertOne 等 |
| 运维监控 | ✅ 慢查询日志、性能统计,开箱即用 | |
| 学习成本 | ⭐⭐⭐ MongoDB 语法 | ⭐ 零学习成本,API 完全一致 |
| 迁移成本 | - | ⭐ 只需修改初始化代码,业务代码不变 |
✅ 适合场景:
- 高并发读取场景(商品详情、用户信息)
- 需要缓存但不想自己实现
- 多实例部署需要缓存一致性
- 希望零学习成本提升性能
- 纯写入应用(缓存作用有限)
- 实时性要求极高(每次必查最新)
- 简单应用,流量不大(原生驱动足够)
// ❌ 原来的代码
const { MongoClient } = require('mongodb');
const client = await MongoClient.connect('mongodb://localhost:27017');
const db = client.db('mydb');
const users = db.collection('users');
// ✅ 迁移后的代码(只需改 3 行)
const MonSQLize = require('monsqlize'); // 1. 引入 monSQLize
const db = new MonSQLize({ // 2. 修改初始化
type: 'mongodb',
config: { uri: 'mongodb://localhost:27017/mydb' },
cache: { enabled: true } // 3. 启用缓存
});
await db.connect();
const users = db.collection('users');
// 🎉 后续所有代码不需要改动,性能提升 10~100 倍!
const user = await users.findOne({ email }); // 完全一样的 API// ✅ 可以混用原生驱动和 monSQLize
const nativeClient = await MongoClient.connect('...');
const monsqlize = new MonSQLize({ cache: { enabled: true } });
// 性能敏感的查询用 monSQLize(启用缓存)
const hotData = await monsqlize.collection('products').find({}, { cache: 60000 });
// 简单查询用原生驱动
const coldData = await nativeClient.db('mydb').collection('logs').find({});- 📖 完整 API 文档索引
- 📖 MongoDB 原生 vs monSQLize 对比
- 📖 事务使用指南
- 📖 业务级分布式锁 🆕 v1.4.0
- 📖 分布式部署指南
- 📖 性能优化指南
CRUD 操作:
- find | findOne | findPage
- insertOne | insertMany | insertBatch
- updateOne | updateMany | replaceOne
- deleteOne | deleteMany
便利方法:
其他功能:
- 📁 完整示例代码目录 - 50+ 可运行示例
| 环境 | 支持版本 |
|---|---|
| Node.js | 16.x, 18.x, 20.x, 21.x |
| MongoDB | 4.4+, 5.x, 6.x, 7.x |
| MongoDB Driver | 4.x, 5.x, 6.x, 7.x |
| 模块系统 | CommonJS, ESM |
- ✅ 业务级分布式锁
- ✅ 智能缓存系统
- ✅ 事务优化
- ✅ 便利方法
- ✅ 分布式支持
- 🔄 查询分析器
- 🔄 自动索引建议
- 🔄 数据迁移工具
- 🔄 GraphQL 支持
- 🔮 统一 API 支持 MySQL
- 🔮 统一 API 支持 PostgreSQL
- 🔮 ORM 功能
- 🔮 数据同步中间件
我们欢迎所有形式的贡献!
# 克隆仓库
git clone https://github.com/vextjs/monSQLize.git
cd monSQLize
# 安装依赖
npm install
# 运行测试
npm test
# 运行基准测试
npm run benchmark- 📧 Email: support@monsqlize.dev
- 💬 Issues: GitHub Issues
- 📖 文档: 完整文档
- 🌟 Star: 如果觉得有用,请给我们一个 Star ⭐