nodejs+mongodb aggregate级联查询操作示例


Posted in NodeJs onMarch 17, 2018

本文实例讲述了nodejs+mongodb aggregate级联查询操作。分享给大家供大家参考,具体如下:

最近完成了一个nodejs+mongoose的项目,碰到了mongodb的级联查询操作。情形是实现一个排行榜,查看某个公司(organization)下属客户中发表有效文ruan章wen最多的前十人。

Account表:公司的信息单独存在一个account表里。

var AccountSchema = new Schema({
  loginname: {type: String},
  password: {type: String},
  /**
   * 联系方式
   */
  //账户公司名
  comName: {type: String},
  //地址
  address: {type: String},
  //公司介绍
  intro: {type: String}
});
mongoose.model('Account', AccountSchema);

Cusomer表:公司的客户群。

var CustomerSchema = new Schema({
  /**
   * 基本信息
   */
  //密码
  password: {type: String},
  //归属于哪个Account
  belongToAccount: {type: ObjectId, ref: 'Account'},
  //手机号,登录用
  mobile: {type: String},
  //真实姓名
  realname: {type: String}
});
CustomerSchema.index({belongToAccount: 1, mobile: 1}, {unique: true});
mongoose.model('Customer', CustomerSchema);

article表

var articleSchema= new Schema({
  belongToAccount: {type: ObjectId, ref: 'Account'},
  title: {type: String},
  text: {type: String},
  createTime: {type: Date, default: Date.now},
  author: {type: ObjectId, ref: 'Customer'},
  //0,待确认,1 有效 ,-1 无效
  status: {type: Number, default: 0}
});
articleSchema.index({belongToAccount: 1, createTime:-1,author: 1}, {unique: false});
mongoose.model('article', articleSchema);

这里要做的就是,由accountId→aggregate整理软文并排序→级联author找到作者的姓名及其他信息。

代码如下:

exports.getRankList = function (accountid, callback) {
  AticleModel.aggregate(
    {$match: {belongToAccount: mongoose.Types.ObjectId(accountid), status: 1}},
    {$group: {_id: {customerId: "$author"}, number: {$sum: 1}}},
    {$sort: {number: -1}}).limit(10).exec(function (err, aggregateResult) {
    if(err){
      callback(err);
      return;
    }
      var ep = new EventProxy();
      ep.after('got_customer', aggregateResult.length, function (customerList) {
        callback(null, customerList);
      });
       aggregateResult.forEach(function (item) {
        Customer.findOne({_id: item._id.customerId}, ep.done(function (customer) {
          item.customerName = customer.realname;
          item.customerMobile=cusomer.mobile;
          // do someting
          ep.emit('got_customer', item);
        }));
      })
    });
};

返回的结果格式(这里仅有两条记录,实际为前十):

[ { _id: { customerId: 559a5b6f51a446602032fs21 }, number: 5,
customerName: 'test2',
mobile:22 } ,
{ _id: { customerId: 559a5b6f51a446602041ee6f }, number: 1,
customerName: 'test1',
mobile: 11 } ]

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 #NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 #NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 #NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 #NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 #NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 #NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 #NodeJs
You might like
php实现微信支付之企业付款
2018/05/30 PHP
网页javascript精华代码集
2007/01/24 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
Prototype框架详解
2015/11/25 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
python3 拼接字符串的7种方法
2018/09/12 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python自动下载图片的方法示例
2020/03/25 Python
python里反向传播算法详解
2020/11/22 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
Java如何获得ResultSet的总行数
2016/09/03 面试题
职业生涯规划怎么写
2013/12/29 职场文书
军训通讯稿范文
2015/07/18 职场文书
《詹天佑》教学反思
2016/02/20 职场文书