Node.js 模式声明和子文档

Node.js 模式声明和子文档,node.js,mongoose,Node.js,Mongoose,你能告诉我我做错了什么吗 var ObjectId=Schema.Types.ObjectId; var ProductSchema=新模式({ 名称:{type:String,必需:true}, 价格:{type:Number,必需:true}, 类别:{type:String,必需:true} }); var OrderSchema=新模式({ 产品:[{ 产品:{type:ObjectId,ref:'product'}, 数量:{type:Number} }], 状态:{type:Stri

你能告诉我我做错了什么吗

var ObjectId=Schema.Types.ObjectId;
var ProductSchema=新模式({
名称:{type:String,必需:true},
价格:{type:Number,必需:true},
类别:{type:String,必需:true}
});
var OrderSchema=新模式({
产品:[{
产品:{type:ObjectId,ref:'product'},
数量:{type:Number}
}],
状态:{type:String,必需:true}
});
Product=mongoose.model('Product',ProductSchema);
Order=rmongose.model('Order',OrderSchema);
OrderSchema.statics.addOrder=函数(数据,cb){
//数据:产品ID的数组
var newOrder=新订单();
data.data.forEach(函数(元素、索引、数组){
Product.findOne({'\id':element.id},函数(err,Product){
if(err)返回handleError(err);
newOrder.products.push({product:product,quantity:element.quantity});
})
});
newOrder.status='waiting';
保存(函数(err,order){
if(err)cb(err,false);
控制台日志(订单);
var response=json.stringify({
事件:“addOrder”,
成功:没错,
数据:order.id
});
cb(错误,响应);
});
}
当我添加订单产品时,数组总是空的,但我没有错误。也许做我想做的是错误的

客户端发送的数据很好,foreach和findOne工作正常,但push似乎没有任何作用

如果没有解决方案,也许你可以试着帮我找到另一个解决方案


谢谢:)

那是因为您需要等待找到所有产品

试试这个(未经测试):

OrderSchema.statics.addOrder = function (data, cb) {
    // data: array of products ID

    var newOrder = new Order();

    var productIds = [];
    var quantity = [];

    data.data.forEach(function(element, index, array) {
        productIds.push(element.id);
        quantity.push(element.quantity);
    });

    Product.find({ '_id' : { $in: productIds} }, function(err, products) {
        if (err) return handleError(err);
        products.forEach(function(product, index) {
            newOrder.products.push({product: product, quantity: quantity[index]});
        });

        newOrder.status = 'waiting';
        newOrder.save(function (err, order) {
            if (err) cb(err, false);
            console.log(order);
            var response = json.stringify({
                event: 'addOrder',
                success: true,
                data: order.id
            });

            cb(false, response);
        });
    });
});