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 相关文章推荐
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 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 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
Python实现的概率分布运算操作示例
2017/08/14 Python
python3学生名片管理v2.0版
2018/11/29 Python
python的常见矩阵运算(小结)
2019/08/07 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
写给保洁员表扬信
2014/01/08 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
代领报检证委托书范本
2014/10/11 职场文书
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android