文档章节

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

o
 osc_gu9d45li
发布于 2019/04/09 09:46
字数 1082
阅读 18
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

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

一,方法介绍

 1,聚合操作之count

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

1 db.User.count(<query>) // 此方法等价于 db.User.find(<query>).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});//连接数据库

 

上一篇: 前端概念可视化
下一篇: 敏捷开发
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
TDD的测试框架--Machine.Specification

Machine.Specification 是一个 TDD 测试驱动开发的测试框架,简化了测试,无需关心语言本身特性。 Machine.Specifications 带来的好处是不需要在代码里有注释,但同时阅读代码的人可以一目了...

匿名
2013/01/22
1.1K
0
在多个浏览器上运行脚本--Queen

假设你想和朋友们玩这么个游戏:你写下某个数字,然后让朋友们猜你写的是什么数字。你的朋友们将不断的给你一些猜测的数字,直到猜中为止。 现在想象你的朋友都是使用的浏览器,这个游戏就相...

匿名
2013/01/24
4.6K
1
基于 ThinkPHP 的内容管理系统--歪酷CMS

歪酷网站管理系统(歪酷CMS)是一款基于THINKPHP框架开发的PHP+MYSQL网站建站程序,本程序实现了文章和栏目的批量动态管理,支持栏目无限分类,实现多管理员管理,程序辅助功能也基本实现了常见的文...

鲁大在线
2013/02/19
7K
2

没有更多内容

加载失败,请刷新页面

加载更多

SQL 语句大全

点击上方“掌上编程”,选择“置顶或者星标” 优质文章第一时间送达! 一、基础 「1、说明:创建数据库」 CREATE DATABASE database-name    「2、说明:删除数据库」 drop database ...

GeneralMa
昨天
0
0
山东创睦网络科技有限公司:使用Python爬取全球新冠肺炎疫情数据

使用Python爬取全球新冠肺炎疫情数据 导入所需库包 获取实时数据的url 正式编写程序 查看输出结果 导入所需库包 在获取数据之前,我们需要先安装好所需的包requests和pandas: 1.如果是使用p...

osc_qv1fwke0
22分钟前
14
0
如何1年获得别人3年的工作经验(深度好文)

最近有同学问我,为什么你的工作年限不长,技术却这么厉害,我笑了笑,啥也没说。 我不是不想回答,是不知道怎么回答。在他们的定位可能就是,每方面都懂一点,遇到问题能够快速解决,就是比...

zhang_rick
今天
0
0
新基建带动行业

什么是“新基建”? 什么是“新基建”? 根据央视发布的信息来看,其涵盖了5G基站建设、新能源汽车充电桩、大数据中心、人工智能、工业互联网,特高压,城际以及城轨交通,涉及了七大领域和相...

osc_anefoz50
22分钟前
0
0
怕入错行?这群技术人写了本“择业指南”

计算机专业好找工作吗?哪些方向是当前的主流和热门方向呢? 计算机专业的你是不是还在为职业发展纠结犹豫呢? 刚经历完高考选专业的你是不是还在迷茫徘徊呢? 那么福利来啦! 《软件技术职业...

阿里云云栖号
22分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部