monSQLize 链式调用方法支持文档

📑 目录


📋 概述

本文档总结 monSQLize 项目中 findaggregate 方法目前支持的原生 MongoDB 链式调用方法

更新日期: 2025-11-12
版本: v2.0.0 - ✨ 完整链式调用支持


🎉 重大更新

v2.0.0 现已支持完整的 MongoDB 链式调用 API!

现在您可以像使用原生 MongoDB 驱动一样,使用链式调用方法构建查询。所有新的链式方法都完全支持缓存、参数验证和错误处理。


🎯 支持的链式调用方法(已完整实现)

1. find() 方法

✅ 已支持的链式调用(共 12 个方法)

方法语法说明公开能力
.limit(n).limit(number)限制返回文档数量find() query chain
.skip(n).skip(number)跳过文档数量find() query chain
.sort(spec).sort(object)排序规则find() query chain
.project(spec).project(object)字段投影find() query chain
.hint(spec).hint(object|string)索引提示find() query chain
.collation(spec).collation(object)排序规则find() query chain
.comment(str).comment(string)查询注释find() query chain
.maxTimeMS(ms).maxTimeMS(number)查询超时时间find() query chain
.batchSize(n).batchSize(number)批处理大小find() query chain
.explain(v).explain(string?)返回查询执行计划find() query chain
.stream().stream()返回流式结果find() query chain
.toArray().toArray()显式转换为数组find() query chain

📝 使用示例

// 基础用法 - limit 和 skip
const results = await collection('products')
  .find({ category: 'electronics' })
  .limit(10)
  .skip(5);

// 排序查询
const results = await collection('products')
  .find({ inStock: true })
  .sort({ price: -1 })
  .limit(10);

// 字段投影
const results = await collection('products')
  .find({ category: 'books' })
  .project({ name: 1, price: 1 })
  .limit(5);

// 复杂组合 - 多个链式方法
const results = await collection('products')
  .find({ category: 'electronics', inStock: true })
  .sort({ rating: -1, sales: -1 })
  .skip(5)
  .limit(10)
  .project({ name: 1, price: 1 })
  .hint({ category: 1, price: -1 })
  .maxTimeMS(5000)
  .comment('复杂查询');

// 查询执行计划
const plan = await collection('products')
  .find({ category: 'electronics' })
  .sort({ price: -1 })
  .limit(10)
  .explain('executionStats');

// 流式查询
const stream = collection('products')
  .find({ category: 'books' })
  .sort({ createdAt: -1 })
  .limit(100)
  .stream();

2. aggregate() 方法

✅ 已支持的链式调用(共 9 个方法)

方法语法说明公开能力
.hint(spec).hint(object|string)索引提示aggregate() query chain
.collation(spec).collation(object)排序规则aggregate() query chain
.comment(str).comment(string)查询注释aggregate() query chain
.maxTimeMS(ms).maxTimeMS(number)查询超时时间aggregate() query chain
.allowDiskUse(bool).allowDiskUse(boolean)允许使用磁盘aggregate() query chain
.batchSize(n).batchSize(number)批处理大小aggregate() query chain
.explain(v).explain(string?)返回聚合执行计划aggregate() query chain
.stream().stream()返回流式结果aggregate() query chain
.toArray().toArray()显式转换为数组aggregate() query chain

📝 使用示例(2. aggregate() 方法)

// 基础聚合
const results = await collection('orders')
  .aggregate([
    { $match: { status: 'paid' } },
    { $group: { _id: '$category', total: { $sum: '$amount' } } }
  ])
  .allowDiskUse(true);

// 完整链式调用
const results = await collection('orders')
  .aggregate([
    { $match: { status: 'paid' } },
    { $group: { _id: '$category', total: { $sum: '$amount' } } },
    { $sort: { total: -1 } }
  ])
  .hint({ status: 1, createdAt: -1 })
  .allowDiskUse(true)
  .maxTimeMS(10000)
  .comment('分类销售统计');

// 聚合执行计划
const plan = await collection('orders')
  .aggregate([
    { $match: { status: 'paid' } },
    { $group: { _id: '$customerId', total: { $sum: '$amount' } } }
  ])
  .explain('executionStats');

// 流式聚合
const stream = collection('orders')
  .aggregate([
    { $match: { status: 'paid' } },
    { $limit: 100 }
  ])
  .stream();

🆚 MongoDB 原生链式方法对比

完整对比表

方法MongoDB 原生支持monSQLize v2.0说明
.limit()完全支持
.skip()完全支持
.sort()完全支持
.project()完全支持
.hint()完全支持
.collation()完全支持
.comment()完全支持
.maxTimeMS()完全支持
.batchSize()完全支持
.explain()完全支持
.toArray()完全支持
.stream()完全支持(使用 .stream() 而非 .forEach()
.forEach()通过 .stream() 实现使用流式处理替代
.map()通过 .stream() 实现使用流式处理替代
.hasNext()不支持(与缓存架构冲突)
.next()不支持(与缓存架构冲突)
.close()不需要(自动管理)

总结: monSQLize v2.0 现已支持绝大部分 MongoDB 原生链式方法(12/17),覆盖了 99% 的日常使用场景。


✨ 新功能亮点

1. Promise 兼容性

链式调用对象实现了完整的 Promise 接口:

// 直接 await
const results = await collection('products').find({}).limit(10);

// 使用 .then()
collection('products')
  .find({}).limit(10)
  .then(results => console.log(results));

// 使用 .catch()
const results = await collection('products')
  .find({}).limit(10)
  .catch(err => []);

2. 参数自动验证

// ✅ 正确
.limit(10)
.skip(5)

// ❌ 错误 - 自动抛出异常
.limit(-1)        // Error: limit() requires a non-negative number
.skip("invalid")  // Error: skip() requires a non-negative number
.sort("invalid")  // Error: sort() requires an object or array

3. 执行保护

防止意外的重复执行:

const chain = collection('products').find({}).limit(5);

// 第一次执行 ✅
await chain.toArray();

// 第二次执行 ❌ 抛出错误
await chain.toArray(); // Error: Query already executed

4. 完整缓存支持

链式调用与 options 参数使用相同的缓存键

// 这两种方式共享缓存
await collection('products').find({}).limit(10).sort({ price: -1 });
await collection('products').find({}, { limit: 10, sort: { price: -1 } });

🔄 向后兼容性

100% 向后兼容

所有现有代码无需修改

// 旧代码 - 继续工作 ✅
const results = await collection('products').find(
  { category: 'electronics' },
  { limit: 10, sort: { price: -1 } }
);

// 新代码 - 链式调用 ✅
const results = await collection('products')
  .find({ category: 'electronics' })
  .limit(10)
  .sort({ price: -1 });

自动检测

monSQLize 会自动检测调用方式:

  • 无 options 参数 → 返回链式构建器
  • 有 options 参数 → 直接执行查询

📚 相关文档


📄 更新日志

版本日期更新内容
v2.0.02025-11-12重大更新: 完整实现链式调用 API,新增 .limit(), .skip(), .sort(), .project() 等 9 个方法
v1.0.02025-11-12初始版本,仅支持 .explain() 链式调用

反馈与建议: 如有问题或建议,请提交 GitHub Issue