Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Async:使用Async.forEach组合两个mongodb集合_Node.js_Mongodb_Mongoose_Mongodb Query_Async.js - Fatal编程技术网

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

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

我对meanstack非常陌生,我正在尝试学习异步

我正在尝试使用

应用这一点,我试图学习最简单有效的方法来完成这些简单的任务,这样就容易理解了

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”放什么。我发布了更多关于该模型的详细信息,以及它是如何被要求的。因此,由于错误,它无法工作。直到我在浏览器中调试它,我才看到错误。