架构声明和子文档

时间:2014-01-21 00:33:47

标签: node.js mongoose

你能告诉我我做错了吗?

var ObjectId = Schema.Types.ObjectId;
var ProductSchema = new Schema({
    name: { type: String, required: true },
    price: { type: Number, required: true },
    category : { type: String, required: true }
});

var OrderSchema = new Schema({
    products: [{
        product: {type: ObjectId, ref: 'Product'},
        quantity: {type: Number}
    }],
    status: { type: String, required: true }
});

Product = mongoose.model('Product', ProductSchema);
Order = rmongoose.model('Order', OrderSchema);

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

    var newOrder = new Order();

    data.data.forEach(function(element, index, array) {

        Product.findOne({ '_id': element.id }, function (err, product) {
            if (err) return handleError(err);

            newOrder.products.push({product: product, quantity: element.quantity});
        })
    });

    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);

    });
}

当我添加订单产品时,数组总是空的但我没有错误。也许做我想做的事是错的。

客户端发送的数据很好,foreach和findOne运行良好,但推送似乎无所事事。

如果没有解决方案,您可以尝试帮助我找到另一种解决方案。

谢谢:)

1 个答案:

答案 0 :(得分:0)

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

试试这个(未经测试):

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);
        });
    });
});