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入门详解(多篇文章结合)
Mar 07 NodeJs
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
14款NodeJS Web框架推荐
Jul 11 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
NodeJS使用formidable实现文件上传
Oct 27 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 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 启动报错如何解决
2014/01/17 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
PHP中使用BigMap实例
2015/03/30 PHP
PHP chop()函数讲解
2019/02/11 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
犀利的js 函数集合
2009/06/11 Javascript
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
javascript回到顶部特效
2016/07/30 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
anaconda如何查看并管理python环境
2019/07/05 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
一封普通求职者的求职信
2013/11/20 职场文书
财务出纳员岗位职责
2013/11/26 职场文书
会计大学生职业生涯规划书范文
2014/01/13 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
董事长助理岗位职责
2014/02/18 职场文书
研究生简历自我评
2015/03/11 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书