` 跳过记录并构建分页)
后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载.skip()是 Waterline ORMSails 内置数据访问层中用于跳过指定数量记录的查询链式方法常与.limit()、.sort()搭配实现数据库分页与偏移取数。本文以 docs/reference/waterline/queries/skip.md 为骨架结合 Querylanguage.md 与lib/hooks/blueprints/下的真实实现源码完整讲解.skip()的签名、用法、边界行为、REST 蓝图中的等价用法及底层调用链帮助你写出可正确落库的分页查询。方法签名与参数说明.skip()用于在执行查询实例query instance返回结果之前先跳过指定数量的记录。.skip(numRecordsToSkip)参数类型说明1numRecordsToSkip((number))要跳过的记录条数非负整数方法本身不返回数据而是返回同一个查询实例因此可以继续链式调用其他查询方法直到用await、.exec()或.then()触发实际执行。查询实例的完整概念链式、延迟执行、await语义可参见 queries.md。基础用法跳过前 N 条记录原文档给出的经典示例取出除第一个名叫 Jake 的用户之外的所有 Jake。var fakeJakes await User.find({ name: Jake }) .skip(1); return res.json(fakeJakes);这里User.find({ name: Jake })返回一个查询实例.skip(1)在其上追加跳过 1 条的意图await触发执行后结果数组中不再包含按默认排序得到的第一个 Jake。链式组合.skip().limit().sort()实现分页.skip()单独使用通常没有意义它与.limit()组合后才能真正构成分页。.skip()决定从第几条开始取.limit()决定最多取几条。// 第 1 页跳过 0 条取 10 条 var page1 await User.find({ name: Jake }) .skip(0) .limit(10); // 第 2 页跳过 10 条取 10 条 var page2 await User.find({ name: Jake }) .skip(10) .limit(10); return res.json({ page1: page1, page2: page2 });提示分页时建议同时使用.sort()固定排序规则否则记录的物理顺序不稳定时各页之间可能出现记录重复或遗漏。这种skiplimit组合也是 Querylanguage.md 中明确推荐的分页构建方式Model.find({ where: { name: foo }, limit: 10, skip: 10 });也就是说skip既可以作为链式方法调用也可以作为查询选项字典中的skip键出现——两者是等价的不同写法最终都会归一化为同一条 Waterline 查询。REST 蓝图路由中的skip从查询参数到查询条件Sails 的蓝图blueprints机制为模型自动生成 RESTful 路由此时skip可以直接作为 URL 查询参数query string传给 find 类的端点。其解析逻辑在 actionUtil.js 中实现// lib/hooks/blueprints/actionUtil.js#L371-L376 parseSkip: function (req) { var DEFAULT_SKIP 0; var skip req.param(skip) || (typeof req.options.skip ! undefined ? req.options.skip : DEFAULT_SKIP); if (skip) { skip skip; } return skip; }从源码可以看到三个关键事实默认值为0未显式指定时跳过 0 条即从第一条开始返回参数来源优先级优先取请求参数req.param(skip)其次取路由配置中的req.options.skip强制数值化通过skip将字符串参数转换为数字避免10这类字符串被误当作查询条件。因此下面的 HTTP 请求即可实现对 User 模型的第二页数据查询GET /user?skip10limit10nameJake对应地parse-blueprint-options.js 中把该参数写入查询条件if (!_.isUndefined(req.param(skip))) { queryOptions.criteria.skip req.param(skip); }随后 find.js 将归一化后的 criteria 交给 Waterline 执行.find(queryOptions.criteria, queryOptions.populates).meta(queryOptions.meta)另外注意parseCriteria中把skip、limit、sort、populate列入了默认黑名单actionUtil.js#L215-L217它们不会被误当作字段过滤条件混入where子句这正是skip作为查询修饰符而非过滤条件的底层保证。关联集合的分页跳过skip不仅作用于顶层模型查询也作用于关联集合collection association的 populate。在 parse-blueprint-options.js 中可以看到蓝图默认对每个 collection 关联生成包含skip: 0的 populate 配置memo[association.alias] { where: {}, limit: DEFAULT_POPULATE_LIMIT, skip: 0, select: [ * ], omit: [] };同时在 populate 场景下同样支持通过请求参数控制偏移if (!_.isUndefined(req.param(skip))) { queryOptions.populates[req.options.alias].skip req.param(skip); }这意味着你可以对某个父记录下的子集合做分页例如获取某个用户的前 10 条评论跳过前 20 条实现嵌套资源的分页取数。边界行为与注意事项原文档明确了两条必须牢记的边界规则如果skip的值大于匹配查询条件的记录总数查询将返回空数组不会报错。.find()在未提供回调函数时返回可链式对象因此.skip()可以继续链式追加过滤条件。// 若库里只有 3 个 Jake则下面返回 [] var none await User.find({ name: Jake }).skip(5);补充几点实战提醒skip必须是非负整数传入小数或负数会产生不可预期的归一化行为建议在业务层先做校验结合.limit()使用时分页语义为跳过前skip条再至多返回limit条大数据量分页时skip值越大数据库端需要丢弃的记录越多查询开销随之上升若表数据量很大可考虑改用基于排序键的游标cursor分页方案但该方法不在 Waterline 内置能力范围内若沿用传统回调风格可把.skip()与.exec()、.then()/.catch()配合使用效果与await完全一致详见 queries.md 中的 Promises and callbacks 一节。小结.skip(numRecordsToSkip)是 Waterline 查询能力中负责偏移的核心方法在链式 API 中与.limit()、.sort()组合实现分页在查询选项字典中作为skip键与where并列使用在 Sails 蓝图 REST 路由中则自动从skip查询参数解析并强制数值化。理解其默认值0、边界行为超出返回空数组以及蓝图层的解析链路actionUtil.parseSkip→queryOptions.criteria.skip→.find(criteria)即可在 Sails 应用中准确、高效地完成各类跳过前 N 条的取数需求。赞分享后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载相关推荐Sails 查询语言Waterline Query Language完全指南从 Criteria 对象到分页排序Sails 查询语言Waterline Query Language完全指南从 Criteria 对象到分页排序 导读 Sails 框架内建的 ORMW后端maku-boot分页查询MybatisPlus分页优化maku boot分页查询MybatisPlus分页优化 痛点企业级应用分页查询的性能瓶颈 在企业级应用开发中分页查询是最常见且最容易出现性能问题的场景之后端低代码代码生成工作流自动化认证鉴权任务调度Helm效果器链配置混响、延迟、失真和共振峰滤波器的完美组合Helm效果器链配置混响、延迟、失真和共振峰滤波器的完美组合 Helm是一款免费的复音合成器以其丰富的调制功能著称。本文将详细介绍如何在Helm中配置混响、AI 技能CLI开发工具人工智能上一篇PostHog Customer Analytics 数据模型指南用 HogQL 查询账户、客户关系、功能请求与自定义属性下一篇lm-watermarking实战指南从安装到部署的完整流程附Hugging Face API教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考