• 技术文章 >web前端 >js教程

    nodejs和mongodb aggregate级联查询操作详解

    小云云小云云2018-03-19 09:08:14原创1990

    最近完成了一个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 } ]

    相关推荐:

    sql 多级分类的级联查询

    以上就是nodejs和mongodb aggregate级联查询操作详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:JS将链接生成二维码并转为图片的方法 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 抖音很火的图片选择题特效,用前端快速实现!• 一文聊聊node后端路由自动加载• 一文详解Node中express的身份认证• 一文浅析node中如何使用消息队列• 【翻译】使用自定义hooks对React组件进行重构
    1/1

    PHP中文网