在MongoDB的查询之外获取数据

我正在做一个购物车,我必须获得产品的价格,以乘以数量,但我有asynchronous的问题,我不能在每个循环迭代的价格。

router.get('/cartlist', function(req, res) { var db = req.db; var collection = db.get('cart'); collection.find({},{},function(e,docs){ var totalPrice = 0; for(var i in docs) { var name = docs[i].productname; var amount = docs[i].amount; var products = db.get('products'); var idPrice = 0; getPrice(products, name, function(data) { idPrice = data; }); console.log(idPrice); } totalPrice += idPrice * amount; console.log(totalPrice); res.render('cartlist', { "cartlist" : docs }); }); }); 

而callback:

 function getPrice(collection, name, callback) { collection.findOne({"productname" : name}, {_id:0, price:1}, function(err, objs) { if(objs != null) { callback(objs.price); } }); } 

当我显示totalPrice的值是0.我该怎么做? 我需要获得价格才能在循环中完成总价格=金额*价格。 谢谢。

假设您的购物车和产品集合具有以下最低限度的架构:

大车

 - productname (reference to product collection on productname field) - amount 

产品

 - productname - price 

然后,使用聚合框架并运行一个pipe道,该pipe道使用$lookup操作符对同一数据库中的products集合执行左外部联接,以便从“已join”集合的文档中进行过滤,然后计算使用$sum$multiply运算符的$grouppipe道内的总价格。

下面的例子显示了你可以如何去做这件事

 router.get('/cartlist', function(req, res) { var db = req.db; var collection = db.get('cart'); collection.aggregate([ { "$lookup": { "from": "products", "foreignField": "productname", "localField": "productname", "as": "productList" } }, { "$unwind": "$productList" }, { "$group": { "_id": null, "totalPrice": { "$sum": { "$multiply": [ "$productList.price", "$amount" ] } }, "cartlist": { "$push": "$$ROOT" } } } ], function(err, result){ console.log(result); console.log(result[0]); console.log(result[0].totalPrice); res.render("cartlist", result); }); });