Skip to content

monSQLize is a universal query adapter that converts various query languages (e.g., SQL for MySQL, PostgreSQL) into MongoDB syntax. It dynamically translates familiar query styles into MongoDB-compatible operations, reducing complexity, saving effort, and improving efficiency, so developers can focus on application logic.

License

Notifications You must be signed in to change notification settings

vextjs/monSQLize

Repository files navigation

🚀 monSQLize

MongoDB 的性能加速器 - 让数据库查询快 10~100 倍

100% API 兼容 · 零学习成本 · 开箱即用

npm version License: MIT Test Coverage MongoDB Node.js

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 策略
自动失效
10~100 倍性能提升

🔄

事务优化

自动管理
只读优化
减少 30% DB 访问

🌐

分布式支持

Redis 广播
多实例一致性
业务级分布式锁

设计理念:零学习成本 · 渐进式采用 · 性能优先 · 生产可靠


💡 为什么选择 monSQLize?

你遇到的问题

😫 数据库性能瓶颈

  • 高并发时查询变慢
  • 热点数据重复查询数据库
  • 聚合统计拖慢响应速度
  • 用户抱怨页面加载慢

😫 代码重复繁琐

  • ObjectId 转换到处都是
  • 批量查询要写很多代码
  • Upsert 操作不够直观
  • 事务代码复杂易错

😫 多实例部署问题

  • 缓存不一致导致脏读
  • 定时任务重复执行
  • 库存扣减并发冲突
  • 需要额外的锁机制

✅ monSQLize 的解决方案

  • 智能缓存系统 - 热点数据走缓存,10~100倍性能提升
  • 自动失效机制 - 写操作自动清理,保证数据一致性
  • 缓存命中率 70~90% - 真实业务场景验证
  • 响应时间 < 1ms - 从 10~50ms 降至毫秒级

✅ monSQLize 的解决方案

  • 便利方法 - findOneById、findByIds、upsertOne
  • 自动转换 ObjectId - 无需手动处理
  • 语义化 API - 代码更清晰易读
  • 事务自动管理 - withTransaction 简化事务代码

✅ monSQLize 的解决方案

  • Redis 广播 - 多实例缓存自动同步
  • 分布式锁 - 解决并发控制问题
  • 定时任务防重 - tryAcquireLock 机制
  • 开箱即用 - 配置简单,无需额外组件

真实效果

场景 优化前 优化后 提升
商品详情页 50ms/次 0.5ms/次 100x
用户列表 80ms/次 0.8ms/次 100x
订单统计 200ms/次 2ms/次 100x
批量插入 10万条 30s 1.2s 25x

缓存命中率:电商 85% · 内容平台 75% · 社交应用 80%


🎯 何时使用 monSQLize?

✅ 适合的场景

场景 说明 预期效果
高并发读取 商品详情、用户信息等热点数据 缓存命中率 7090%,响应时间从 1050ms 降至 < 1ms
复杂查询 聚合统计、关联查询 重复查询直接走缓存,避免重复计算
多实例部署 负载均衡、水平扩展 Redis 广播保证缓存一致性
事务密集 订单、支付等业务 自动管理事务,优化只读操作
并发控制 库存扣减、定时任务 分布式锁解决复杂并发场景

⚠️ 不适合的场景

场景 原因 建议
纯写入应用 大量写入,很少查询 缓存作用有限,使用原生驱动即可
实时性要求极高 必须每次查询最新数据 不启用缓存,或使用极短 TTL
简单 CRUD 简单应用,流量不大 原生驱动足够,无需引入复杂度
内存受限 服务器内存紧张 缓存会占用额外内存

💡 使用建议

  • 渐进式采用:先在热点查询启用缓存,观察效果后逐步扩展
  • 监控指标:关注缓存命中率、内存使用、慢查询日志
  • 合理配置:根据业务特点调整 TTL、缓存大小
  • 混合使用:可与原生驱动混用,性能敏感用 monSQLize,简单查询用原生

🚀 快速开始

安装

npm install monsqlize

基础使用

const 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 });

🌟 核心特性

1. ⚡ 智能缓存系统 - 性能提升 10~100 倍

特性

  • TTL 过期策略 - 指定缓存时间
  • LRU 淘汰策略 - 自动淘汰旧数据
  • 自动失效 - 写操作自动清理缓存
  • 并发去重 - 相同查询只执行一次
  • 多层缓存 - 内存 + Redis
  • 命名空间隔离 - 按集合独立管理

性能提升

操作 原生驱动 monSQLize 提升
热点查询 50ms 0.5ms 100x
复杂聚合 200ms 2ms 100x
列表查询 30ms 0.3ms 100x
// 一行代码启用缓存
const users = await collection.find({ status: 'active' }, { cache: 60000 });

2. 🔄 事务管理优化 - 减少 30% 数据库访问

// 自动管理事务生命周期
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 回滚
});

3. 📦 便利方法 - 减少 60~80% 代码

❌ 原生驱动

// 查询单个文档(需要手动转换 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%!

4. 🌐 分布式部署支持

// 多实例部署,Redis 自动同步缓存
const db = new MonSQLize({
    cache: {
        distributed: {
            enabled: true,
            redis: redisInstance  // 使用 Redis 广播缓存失效
        }
    }
});

// 实例 A 更新数据
await users.updateOne({ _id: userId }, { $set: { name: 'Bob' } });
// ⚡ 实例 B/C/D 的缓存自动失效

5. 🆕 业务级分布式锁(v1.4.0)

// 🔥 解决复杂业务场景的并发问题

// 场景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 防死锁 · 支持续期 · 降级策略

📖 完整文档

6. 🚀 高性能批量插入

// 批量插入 10 万条数据
await users.insertBatch(documents, {
    batchSize: 1000,     // 每批 1000 条
    retryTimes: 3,       // 失败重试 3 次
    onProgress: (stats) => {
        console.log(`进度: ${stats.inserted}/${stats.total}`);
    }
});

性能: 比原生 insertMany10~50 倍

7. 📊 深度分页 - 支持千万级数据

// 千万级数据分页(游标分页,性能稳定)
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} 页`);

8. 🛠️ 运维监控(开箱即用)

// 🆕 慢查询日志持久化存储(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 倍


🎨 完整功能清单

📦 MongoDB 原生功能

CRUD 操作

  • find / findOne
  • insertOne / insertMany
  • updateOne / updateMany
  • deleteOne / deleteMany
  • replaceOne
  • findOneAndUpdate
  • findOneAndReplace
  • findOneAndDelete

聚合 & 查询

  • aggregate
  • count / distinct
  • watch (Change Streams)
  • explain

索引管理

  • createIndex / createIndexes
  • listIndexes
  • dropIndex / dropIndexes

事务支持

  • withTransaction
  • startTransaction

🚀 增强功能

智能缓存

  • TTL 过期策略
  • LRU 淘汰策略
  • 自动失效机制
  • 并发去重
  • 多层缓存 (内存+Redis)

便利方法

  • findOneById
  • findByIds
  • upsertOne
  • incrementOne
  • findAndCount

性能优化

  • 批量插入优化
  • 只读事务优化
  • Count 队列控制
  • 连接池管理

分布式支持

  • Redis 广播缓存失效
  • 分布式锁
  • 多实例一致性

🛠️ 企业级特性

运维监控

  • 慢查询日志(支持持久化存储)🆕
  • 性能指标统计
  • 健康检查
  • 缓存命中率监控

深度分页

  • 游标分页
  • 异步总数统计
  • 书签管理
  • 跳页优化

数据库管理

  • 跨库访问
  • Schema 验证
  • 集合管理
  • 数据库命令

开发体验

  • TypeScript 支持
  • 链式调用 API
  • ESM/CommonJS 双模式
  • 77% 测试覆盖率

🆚 与 MongoDB 原生驱动对比

特性 MongoDB 原生 monSQLize
API 兼容性 ✅ 原生 ✅ 100% 兼容原生,无需学习新 API
智能缓存 ❌ 需要自己实现 ✅ 内置 TTL/LRU,开箱即用,10~100倍提升
性能 ⭐⭐⭐ 基准性能 ⭐⭐⭐⭐⭐ 缓存命中时性能提升 10~100 倍
事务支持 ⭐⭐ 需要手动管理 ⭐⭐⭐⭐⭐ 自动管理生命周期,优化只读操作
分布式部署 ❌ 缓存不一致 ✅ Redis 广播自动同步,保证一致性
便利方法 ❌ 需要自己封装 ✅ findOneById、findByIds、upsertOne 等
运维监控 ⚠️ 需要额外配置 ✅ 慢查询日志、性能统计,开箱即用
学习成本 ⭐⭐⭐ MongoDB 语法 ⭐ 零学习成本,API 完全一致
迁移成本 - ⭐ 只需修改初始化代码,业务代码不变

📌 何时选择 monSQLize

适合场景

  • 高并发读取场景(商品详情、用户信息)
  • 需要缓存但不想自己实现
  • 多实例部署需要缓存一致性
  • 希望零学习成本提升性能

⚠️ 不适合场景

  • 纯写入应用(缓存作用有限)
  • 实时性要求极高(每次必查最新)
  • 简单应用,流量不大(原生驱动足够)

🚀 快速迁移指南

从 MongoDB 原生驱动迁移

// ❌ 原来的代码
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({});

📖 完整文档

核心文档

功能文档

CRUD 操作:

便利方法:

其他功能:

示例代码


🌍 兼容性

环境 支持版本
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

查看完整兼容性矩阵


🗺️ 产品路线图

✅ v1.4 (当前版本)

  • ✅ 业务级分布式锁
  • ✅ 智能缓存系统
  • ✅ 事务优化
  • ✅ 便利方法
  • ✅ 分布式支持

🚧 v1.5 (计划中)

  • 🔄 查询分析器
  • 🔄 自动索引建议
  • 🔄 数据迁移工具
  • 🔄 GraphQL 支持

🔮 v2.0 (未来)

  • 🔮 统一 API 支持 MySQL
  • 🔮 统一 API 支持 PostgreSQL
  • 🔮 ORM 功能
  • 🔮 数据同步中间件

🤝 贡献指南

我们欢迎所有形式的贡献!

开发

# 克隆仓库
git clone https://github.com/vextjs/monSQLize.git
cd monSQLize

# 安装依赖
npm install

# 运行测试
npm test

# 运行基准测试
npm run benchmark

📄 许可证

MIT License


💬 社区与支持


🎉 快速链接

🚀 快速开始 · 📚 完整文档 · 💻 示例代码 · 🐛 报告问题 · ⭐ Star 项目


让 MongoDB 快 10~100 倍,从现在开始 🚀

npm install monsqlize

Made with ❤️ by monSQLize Team

About

monSQLize is a universal query adapter that converts various query languages (e.g., SQL for MySQL, PostgreSQL) into MongoDB syntax. It dynamically translates familiar query styles into MongoDB-compatible operations, reducing complexity, saving effort, and improving efficiency, so developers can focus on application logic.

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published

Languages