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 相关文章推荐
提高NodeJS中SSL服务的性能
Jul 15 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
javascript 事件绑定问题
2011/01/01 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
p5.js实现简单货车运动动画
2019/10/23 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
Vue看了就会的8个小技巧
2021/01/21 Vue.js
Nest.js散列与加密实例详解
2021/02/24 Javascript
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
回调函数的意义以及python实现实例
2017/06/20 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
对python中return与yield的区别详解
2020/03/12 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
行政助理岗位职责
2013/11/10 职场文书
汽修专业学生自我鉴定
2013/11/16 职场文书
机关会计岗位职责
2014/04/08 职场文书
关爱残疾人标语
2014/06/25 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android