
NeDB排序、分页与投影用Cursor API实现复杂数据检索的完整指南【免费下载链接】nedbThe JavaScript Database, for Node.js, nw.js, electron and the browser项目地址: https://gitcode.com/gh_mirrors/ne/nedbNeDB 是一个 100% JavaScript 编写的内嵌式数据库可用于 Node.js、nw.js、Electron 和浏览器无任何二进制依赖。当你需要在查询结果上做**排序sort、分页skip/limit和字段投影projection**时NeDB 提供的Cursor API可以让你用一行链式调用完成复杂的 data 检索。本文是一份面向新手的完整指南带你快速掌握 NeDB 排序、分页与投影的用法与常见坑点。NeDB 数据库的 Cursor API 是什么在 NeDB 中find、findOne和count都有两种调用方式传回调函数直接执行查询拿到结果不传回调函数返回一个Cursor对象你可以继续链式调用sort、skip、limit、projection最后用exec(callback)执行。这正是 MongoDB 风格的游标思想核心实现位于 lib/cursor.jsdb.find({}).sort({ planet: 1 }).skip(1).limit(2).exec(function (err, docs) { // docs 是排序、跳过、截取后的结果集 });find返回 Cursor 的入口逻辑见 lib/datastore.js。一行代码实现排序NeDB sort 用法sort接收一个{ 字段: 方向 }对象1表示升序-1表示降序也支持多字段组合排序和点语法嵌套字段// 按 planet 升序 db.find({ system: solar }).sort({ planet: 1 }).exec(function (err, docs) {}); // 降序 db.find({ system: solar }).sort({ planet: -1 }).exec(function (err, docs) {}); // 多字段先按 firstField 升序再按 secondField 降序 db.find({}).sort({ firstField: 1, secondField: -1 }).exec(function (err, docs) {}); 内部机制NeDB 在排序完成后才应用skip和limit见 lib/cursor.js因此无论你在链式调用中把sort放在哪里分页永远作用在排序后的结果上顺序符合直觉。快速分页NeDB skip 与 limit 组合技巧分页只需两个方法skip(n)跳过前 n 条limit(n)最多取 n 条。两者都可以省略也可以组合// 第 2 页每页 10 条 db.find({}).sort({ createdAt: -1 }).skip(10).limit(10).exec(function (err, docs) {});方法作用示例sort按字段排序1 升序 / -1 降序.sort({ age: -1 })skip跳过前 N 条结果.skip(20)limit最多返回 N 条结果.limit(10)projection只保留 / 排除部分字段.projection({ name: 1 })exec执行查询并回调结果.exec(cb)⚠️关键提醒skip和limit只是把参数存进游标在exec时才统一生效所以调用先后顺序不影响结果。但如果不加sort结果顺序是不确定的见 test/cursor.test.js 中的测试说明做分页时务必先排序否则翻页内容会漂移。NeDB 投影 projection只取你需要的字段投影决定返回文档中包含哪些字段语法与 MongoDB 一致值1表示保留值0表示排除。你有两种等价的写法写法一作为 find 的第二个参数// 只保留 planet 和 system 字段_id 默认保留 db.find({ planet: Mars }, { planet: 1, system: 1 }, function (err, docs) { // docs is [{ planet: Mars, system: solar, _id: id1 }] });写法二游标链式调用db.find({ planet: Mars }).projection({ planet: 1, system: 1 }).exec(function (err, docs) {});三条实用规则不能混用保留与排除{ planet: 1, system: 0 }会抛出Cant both keep and omit fields except for _id错误校验逻辑见 lib/cursor.js_id特殊默认始终返回显式写_id: 0可将其排除且它允许与保留/排除模式混用支持点语法投影嵌套字段db.findOne({ planet: Earth }).projection({ planet: 1, humans.genders: 1 }).exec(function (err, doc) { // doc is { planet: Earth, _id: id2, humans: { genders: 2 } } }); 投影在排序、分页之后执行见 lib/cursor.js所以排序字段不需要出现在投影结果里可以安全地把大字段裁掉再返回给前端。实战组合排序 分页 投影一次搞定以一个最新订单列表为例按创建时间倒序、取第 3 页每页 10 条、只返回下单人和金额字段db.find({ paid: true }) .sort({ createdAt: -1 }) .skip(20) .limit(10) .projection({ buyer: 1, amount: 1 }) .exec(function (err, docs) { // docs 为第 3 页的 10 条精简记录 });配合count可以得到总条数、计算总页数count底层同样复用游标见 lib/datastore.jsdb.count({ paid: true }, function (err, total) { // totalPages Math.ceil(total / 10) });新手常见坑点速查问题原因解决翻页内容不稳定未排序就分页先.sort()再.skip().limit()投影报Cant both keep and omit混用了1和0统一用保留或统一用排除_id除外只想要第一条却返回多条用了find而非findOnefindOne内部自动limit(1)lib/datastore.js传了回调却无法链式排序find(query, callback)立即执行需要排序/分页时不要传回调改传投影或干脆省略延伸阅读核心源码与测试游标全部实现sort/skip/limit/projection/execlib/cursor.jsfind/findOne/count与游标的衔接lib/datastore.js排序、分页、投影的完整测试用例test/cursor.test.js查询性能基准benchmarks/find.js官方文档对应章节README.md掌握 NeDB 的 Cursor API 后排序、分页、投影这些复杂数据检索需求只需一行链式调用即可完成。配合内嵌式数据库的零依赖特性它非常适合 Electron 桌面应用和浏览器端的本地数据场景。【免费下载链接】nedbThe JavaScript Database, for Node.js, nw.js, electron and the browser项目地址: https://gitcode.com/gh_mirrors/ne/nedb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考