在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
运算符的$group
pipe道内的总价格。
下面的例子显示了你可以如何去做这件事
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); }); });