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调用cmd命令实现复制目录
May 04 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
NodeJS实现同步的方法
Mar 02 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/05/22 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
python自然语言编码转换模块codecs介绍
2015/04/08 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python实现简单http服务器功能
2018/09/17 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
应届生简历中的自我评价
2014/01/13 职场文书
教师专业自荐书范文
2014/02/10 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
《悯农》教学反思
2014/04/28 职场文书
平面设计专业求职信
2014/08/09 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python