Node.js Async:使用Async.forEach组合两个mongodb集合
我对meanstack非常陌生,我正在尝试学习异步 我正在尝试使用 应用这一点,我试图学习最简单有效的方法来完成这些简单的任务,这样就容易理解了Node.js Async:使用Async.forEach组合两个mongodb集合,node.js,mongodb,mongoose,mongodb-query,async.js,Node.js,Mongodb,Mongoose,Mongodb Query,Async.js,我对meanstack非常陌生,我正在尝试学习异步 我正在尝试使用 应用这一点,我试图学习最简单有效的方法来完成这些简单的任务,这样就容易理解了 var OrderSchema = new mongoose.Schema({ menu_id: {type:mongoose.Schema.Types.ObjectId, ref: 'Foods'}, menu_name: {type:String,required:false}, customer_id: {type:St
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 }
},...]
如果您需要更多说明或缺少某些内容,请发表评论。非常感谢。干杯 完成这项简单任务的最简单、最有效的方法是使用聚合框架,在聚合框架中,您可以利用mongo的本机操作符(如)来过滤文档流,以便只允许匹配的文档未经修改地传递到下一个管道阶段,并执行到下一个管道的左外部联接同一数据库中的付款托收,用于从“已加入”托收中筛选文档以进行处理:
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
键,而是\u id
,因此应该
PaymentModel.find({ "order_id": vorders._id }, function(err, payments){
async.forEach回调不提供数据,您应该使用aysnc.map。我尝试将查询中的数据存储到局部变量中,这样,如果任务完成,响应数据将成为局部变量。对吗?谢谢!订单id:“id”或订单id:ObjectId(“id”)有区别吗?我无法使它看起来有效这个答案非常简单明了,我不需要使用async来达到我的要求。你不必在Mongoose中向
ObjectId
强制转换字符串,因为它会隐式地为你做这件事(“幕后”),我知道,我正在尝试实现你的代码,但我仍然没有定义。我不确定在$lookup中用“from”放什么。我发布了更多关于该模型的详细信息,以及它是如何被要求的。因此,由于错误,它无法工作。直到我在浏览器中调试它,我才看到错误。