asynchronous:使用Async.forEach组合两个mongodb集合

我是非常新的平均值堆栈,我正在尝试学习asynchronous。

我正在尝试使用asynchronous结合来自MongoDB的两个集合

并将这个迭代应用到一个集合上,为每个项目执行一个asynchronous任务 ,我试图学习这个简单任务的最简单有效的方法,这样很容易理解。

var OrderSchema = new mongoose.Schema({ menu_id: {type:mongoose.Schema.Types.ObjectId, ref: 'Foods'}, menu_name: {type:String,required:false}, customer_id: {type:String,required: true,}, customer_name:{type:String, required: false}, table_no:{type:String,required:true}, cooking:{type:Boolean, require:false, default:false}, ready:{type:Boolean,default:false}, served:{type:Boolean,default:false}, paid:{type:Boolean, default:false}, price: {type:Number, default:0}, quantity: {type:Number,default:0}, created_at: { type: Date, default: Date.now } } 

付款模型

 var mongoose = require('mongoose'); var PaymentSchema = new mongoose.Schema({ order_number: {type:String, required: true, index: true}, order_id: {type:mongoose.Schema.Types.ObjectId, ref: 'Orders'}, date: { type: Date, default: Date.now }, customer_id: {type:mongoose.Schema.Types.ObjectId, ref: 'User'}, amount : { type: Number, required:true }, company_id: {type:mongoose.Schema.Types.ObjectId, ref: 'Company'} }, { toJSON: { virtuals: true }, toObject: { virtuals: true } }); module.exports = mongoose.model('Payments', PaymentSchema); 

这是我的代码

 var data = req.body; var calls = []; var local_orders = []; var OrderModel = require('../models/Order'); var PaymentModel = require('../models/Payment'); OrderModel.find({'table_no': data.table_no}, function(err,orders){ async.forEach(orders, function(vorders, callback){ PaymentModel.find({order_id:vorders.id}, function(err, payments){ vorders.payments = 'payments'; local_orders.push(vorders) }); return callback(null, local_orders); }, function(err,local_orders){ if(err){ res.status('500').send(err); } res.send(local_orders) }); }) 

我期待收到这样的JSON对象,但我得到的是未定义的。

 [{ menu_id: {type:mongoose.Schema.Types.ObjectId, ref: 'Foods'}, menu_name: {type:String,required:false}, user_id: {type:String,required: true,}, customer_name:{type:String, required: false}, table_no:{type:String,required:true}, cooking:{type:Boolean, require:false, default:false}, ready:{type:Boolean,default:false}, served:{type:Boolean,default:false}, paid:{type:Boolean, default:false}, price: {type:Number, default:0}, quantity: {type:Number,default:0}, created_at: { type: Date, default: Date.now }, payments : [{ payment1 },{ payment2 } },...] 

请评论,如果你需要更多的澄清或缺less的东西。 谢谢! 干杯!

执行这个简单任务的最简单和最有效的方法是使用聚合框架,您可以利用mongo的本地运算符(如$match来过滤文档stream,只允许匹配的文档未修改地传递到下一个stream水线阶段, $lookup对同一数据库中的付款收款的左外部联合,以便从“已join”收款的文件中进行过滤以进行处理:

 var data = req.body; OrderModel.aggregate([ { "$match": { "table_no": data.table_no } }, { "$lookup": { "from": "payments", "localField": "_id", "foreignField": "order_id", "as": "payments" } } ]).exec(function (err, result){ if (err){ res.status('500').send(err); } res.send(result) }); 

但是,就目前来看,你的代码在这里失败了

 PaymentModel.find({ order_id: vorders.id }, function(err, payments){ 

因为vorders对象没有任何id键而是_id ,所以应该是

 PaymentModel.find({ "order_id": vorders._id }, function(err, payments){