NodeJs操作MongoDB之分页功能与常见问题

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: NodeJs操作MongoDB之分页功能与常见问题一,方法介绍 1,聚合操作之countcount()方法可以查询统计符合条件的集合的总数1 db.User.count() // 此方法等价于 db.User.find().count()在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate;2,find() 方法以非结构化的方式来显示所有文档。

NodeJs操作MongoDB之分页功能与常见问题
一,方法介绍
1,聚合操作之count

count()方法可以查询统计符合条件的集合的总数

1 db.User.count() // 此方法等价于 db.User.find().count()
在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate;

2,find() 方法以非结构化的方式来显示所有文档。

1 db.User.find();//相当于:select* from User;
3,exec() 方法用于检索字符串中的正则表达式的匹配。(javascript方法)

4,sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

1 升序:db.User.find().sort({CreateTime: 1});
2 降序:db.User.find().sort({CreateTime: -1});
5,skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

1 db.User.find().skip(2)//跳过2条
6,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。一般与skip连用

1 # limit()中number值为空时代表全部查出
2 db.User.find().limit(2) #读取的条数
1 # 常用在分页方法中
2 # 查询User集合中,跳过前两条记录,每页一条记录
3 > db.User.find().skip(2).limit(1)
二,封装与接口抛出
2.1,分页查询
1,根据查询条件获取总条数,使用count({},callback)方法
复制代码
1 /**
2 * 根据条件获取有多少条数据 文档数
3 * @param table_name 表名
4 * @param conditions 查询条件 {a:1, b:2}
5 * @param callback 回调方法
6 */
7 MongoDbAction.getTotal = function (table_name, conditions, callback) {
8 var node_model = this.getConnection(table_name);
9 if (!node_model || node_model.message) {
10 if (callback) callback(1, node_model)
11 } else {
12 node_model.find(conditions)
13 .count({})
14 .exec(function (err, total) {
15 if (err) {
16 if (callback) callback(err);
17 } else {
18 if (callback) callback(null, total);
19 }
20 });
21 }
22 };
复制代码
2,实现连写查询
(1)这个可以用来做分页,表示获取从第1条(第1条记录序号为0)记录开始的10条记录.类似与Mysql的limit 0, 10,如下:

{

limit:10,//pageSize
skip:0//page:skip+1

}
(2)按某个字段升序(1)降序(-1),如下 按照创建时间进行降序排列
sort: {CreateTime: -1},
(3)代码连写查询实现:
复制代码
1 /**
2 * 连写查询 查询多条数据
3 * @param table_name 表名
4 * @param conditions 查询条件 {a:1, b:2}
5 * @param options 选项:{fields: "a b c", sort: {time: -1}, limit: 10}
6 * @param callback 回调方法
7 */
8 MongoDbAction.whereCondition = function (table_name, conditions, options, callback) {
9 var node_model = this.getConnection(table_name);
10 if (!node_model || node_model.message) {
11 if (callback) callback(1, node_model)
12 } else {
13 node_model.find(conditions)
14 .select(options.fields || '')
15 .sort(options.sort || {})//排序 //按某个字段升序(1)降序(-1)
16 .skip(options.skip || 0)//跳过的条数
17 .limit(options.limit || {})//查询几条
18 .exec(function (err, res) {
19 if (err) {
20 if (callback) callback(err);
21 } else {
22 if (callback) callback(null, res);
23 }
24 });
25 }
26 };
复制代码
3,根据所传的参数实现分页查询
抛出分页查询的接口

复制代码
1 //连写查询数据 包括分页 获取总条数
2 router.put('/user/getSingleAndManyData', function (req, res) {
3 var tableName = req.body.tableName;//'User'
4 var IsEnable = req.body.IsEnable;
5 var limit = req.body.pageSize;
6 var sort = req.body.sort;
7 var skip = req.body.page;
8 let conditions = {
9 IsEnable
10 }
11 let options = {
12 sort: {CreateTime: sort},//排序
13 limit,//pageSize
14 skip:(limit*(skip-1))//page
15 }
16 // let options = {
17 // sort: {CreateTime: -1},//按某个字段升序(1)降序(-1)
18 // limit:10,
19 // skip:(limit*(skip-1))//skip=1=> skip:0
20 // }
21 // 这个可以用来做分页,表示获取从第1条(第1条记录序号为0)记录开始的10条记录.类似与Mysql的limit 0, 10
22 let data = {
23 httpCode: 200,
24 message: "查询成功!",
25 status: 1,
26 data: null,
27 page:skip,
28 pageSize:limit
29 }
30
31 MongoDbAction.getTotal(tableName,conditions, function (err, total) {
32 if (err) {
33 data.total=0
34 data.status = 0
35 data.message = "未查询到数据!"
36 data.data = null
37 res.status(data.httpCode).json(data);
38 } else {
39 MongoDbAction.whereCondition(tableName,conditions,options, function (err, result) {
40 if (!err) {
41 data.total=total
42 data.data = result
43 res.status(data.httpCode).json(data);
44 } else {
45 data.total=0
46 data.status = 0
47 data.message = "未查询到数据!"
48 data.data = result
49 res.status(data.httpCode).json(data);
50 }
51 });
52 }
53 });
54
55 })
复制代码
4,接口调用,返回的结果集如下:

三,常见问题
1,连接警告
警告:(node:204) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

1 mongoose.connect(dbURL);// 连接数据库 存在警告

解决办法:连接配置添加: { useNewUrlParser: true }

1 mongoose.connect(dbURL,{useNewUrlParser:true});//连接数据库
原文地址https://www.cnblogs.com/jackson-zhangjiang/p/10291505.html

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5月前
|
NoSQL MongoDB 数据库
MongoDB 分页神器:limit() 和 skip() 方法详解
MongoDB 分页神器:limit() 和 skip() 方法详解
|
22天前
|
NoSQL 前端开发 JavaScript
Node.js 连接 MongoDB
10月更文挑战第20天
32 0
|
6月前
|
Oracle NoSQL 关系型数据库
实时计算 Flink版产品使用合集之MongoDB CDC connector的全量快照功能可以并发读取吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
118 2
|
1月前
|
NoSQL 前端开发 JavaScript
Node.js 连接 MongoDB
10月更文挑战第9天
44 0
|
1月前
|
JavaScript NoSQL 前端开发
使用 Node.js 和 MongoDB 构建实时聊天应用
【10月更文挑战第2天】使用 Node.js 和 MongoDB 构建实时聊天应用
|
3月前
|
JavaScript NoSQL 前端开发
|
3月前
|
存储 NoSQL 数据管理
揭秘MongoDB时间序列集合:这个超级功能将如何彻底改变你的数据管理?
【8月更文挑战第8天】时间序列数据记录随时间变化的信息,在数据库管理中至关重要。MongoDB自4.0版起引入时间序列集合,专为这类数据优化存储与查询。通过问答形式介绍其特点:自动数据过期、高效存储机制及快速查询操作。创建时需指定时间字段及可选元数据字段。支持设置数据过期时间,采用粗粒度索引减少I/O操作。查询时可通过时间范围筛选数据,并利用聚合框架进行数据分析。随着实时分析需求的增长,时间序列集合的应用将更加广泛。
161 0
|
5月前
|
存储 NoSQL MongoDB
MongoDB实战面试指南:常见问题一网打尽
MongoDB实战面试指南:常见问题一网打尽
|
4月前
|
NoSQL 关系型数据库 MySQL
MongoDB优化分页
【7月更文挑战第5天】
80 0
|
5月前
|
存储 负载均衡 NoSQL
MongoDB的分片功能
【6月更文挑战第6天】MongoDB的分片功能
67 1