nodejs+mongodb aggregate级联查询操作示例
本文实例讲述了nodejs+mongodbaggregate级联查询操作。分享给大家供大家参考,具体如下:
最近完成了一个nodejs+mongoose的项目,碰到了mongodb的级联查询操作。情形是实现一个排行榜,查看某个公司(organization)下属客户中发表有效文ruan章wen最多的前十人。
Account表:公司的信息单独存在一个account表里。
varAccountSchema=newSchema({ loginname:{type:String}, password:{type:String}, /** *联系方式 */ //账户公司名 comName:{type:String}, //地址 address:{type:String}, //公司介绍 intro:{type:String} }); mongoose.model('Account',AccountSchema);
Cusomer表:公司的客户群。
varCustomerSchema=newSchema({ /** *基本信息 */ //密码 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表
vararticleSchema=newSchema({ 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; } varep=newEventProxy(); 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; //dosometing ep.emit('got_customer',item); })); }) }); };
返回的结果格式(这里仅有两条记录,实际为前十):
[{_id:{customerId:559a5b6f51a446602032fs21},number:5, customerName:'test2', mobile:22}, {_id:{customerId:559a5b6f51a446602041ee6f},number:1, customerName:'test1', mobile:11}]
希望本文所述对大家nodejs程序设计有所帮助。