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程序设计有所帮助。