简介
waterline-cursor
是一个 npm
包,用来实现与 waterline
框架一起工作的数据库游标。游标是查询结果集上可滚动的位置标记,可以逐个访问数据,适用于大数据集合。
如果要实现对大数据集合的查询和处理,传统的分页查询,比较耗时而且容易出现重复数据和遗漏数据等问题,使用游标操作可以精准定位每条数据位置,并高效的获取大量数据,避免数据的遗漏和重复读取。
waterline-cursor
使用起来比较简单,只需要传入相应的参数即可实现游标操作。
安装
使用 npm
可以方便的进行安装。
npm install waterline-cursor --save
使用
安装 waterline-cursor
之后,可通过以下方式进行使用。
初始化
建议将 waterline-cursor
包添加到项目依赖中,并将其引入项目。
const Cursor = require('waterline-cursor');
参数
创建游标之前,我们需要传入相应的参数,包括 model
和 query
。
model
:需要进行查询的模型,通过waterline
创建。query
:是一个对象,包含查询条件以及其他查询参数,如 where 和 select。
查询数据
以下为示例代码,使用了 sails.js
框架集成的 waterline
进行所有操作,其余框架需要针对自己的框架进行修改。
-- -------------------- ---- ------- ----- -------- --------------- - ----- ----- - - --------- ------ -- ----- ------ - ------ ----------- --------- ----- ----- - - ------ ------ -- ----- ----- - ------------------ ----- ------ - --- -------- ------ ------ ----- --- ----- ---- - ----- --------------- ------------------ -
接下来我们分别讲解上述代码中各个参数及其作用:
where
:是一个对象,由waterline
提供,用于存储查询条件select
:是一个数组,由waterline
提供,用于存储需要查询的字段Model
:是通过sails.js
创建的模型cursor
:用于创建游标fetch
:用于获取符合条件的分页数据,一次最多只可获取999条
这里,我们使用 user
模型进行数据查询,设置 username
字段等于 user
,并指定需要查询的字段。游标使用 Cursor
来创建,并且在获取数据之前需要使用 fetch
方法来指定查询结果的数量。
查询到的数据将会返回一个数组,其中存储了查询结果集。
游标查询
游标查询要比传统的分页查询更为高效,可以精准定位每条数据位置,无需服务器进行计算。以下为示例代码。
-- -------------------- ---- ------- ----- -------- --------------- - ----- ----- - - --------- ------ -- ----- ------ - ------ ----------- --------- ----- ----- - - ------ ------ -- ----- ----- - ------------------ ----- ------ - --- -------- ------ ------ ----- --- -------------------------- ----- ---- - ----- --------------- ------------------ -
上述代码中,我们使用游标查询前50个结果,忽略前10个结果,也就是说,按照 id
字段进行排序的话,返回结果将是 id
在从 10 到 60 的范围内。limit
和 skip
方法用于指定查询开始位置和查询结果的数量,并将其传递给 fetch
方法,用于获取需要查询的数据。
游标关闭
必须通过调用 close
方法来关闭游标,从而释放资源。
cursor.close();
总结
waterline-cursor
的使用相对来说比较简单,可以方便的实现游标查询。在处理大数据集合时,传统的分页查询确实很难处理,而游标查询可以很高效的处理查询,并且精确的定位每条数据的位置,避免数据遗漏或读取数据的重复。对于前端类开发人员而言,waterline-cursor
是一个非常优秀的数据库游标,可以在大数据集合下快速定位查询并高效的获取数据。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67381