【问题标题】:Obtain data outside the query in MongoDB获取MongoDB中查询之外的数据
【发布时间】:2016-12-04 18:27:54
【问题描述】:

我正在做一个购物车,我必须获得产品的价格才能乘以数量,但我遇到了异步问题,我无法在循环的每次迭代中获得价格。

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

还有回调:

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

当我显示 totalPrice 的值为 0 时。我该怎么做?我需要获取价格才能在循环中执行 totalprice += amount * price。谢谢。

【问题讨论】:

  • 您能否编辑您的问题以显示来自cartproducts 集合的一些示例文档?

标签: javascript node.js mongodb callback


【解决方案1】:

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

购物车

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

产品

- productname
- price

然后使用聚合框架并运行一个管道,该管道采用 $lookup 运算符对同一数据库中的 products 集合执行左外连接以进行过滤,这将变得更加容易和高效在 "joined" 集合的文档中进行处理,然后使用 $sum$multiply 管道计算总价强> 运算符。

下面的例子展示了你如何去做这个

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

【讨论】:

  • 谢谢!有效。现在我必须尝试在产品中编码像 3x2 这样的东西。你有什么想法在这个左外连接中做吗?
  • 如果我有一个示例产品文档,我可以。您介意通过编辑您的问题并包含它们来分享一些示例文档吗?
  • 产品文档与您的类似,但多了一个或两个字段并带有附加信息:例如是饮料还是餐点。如果我们在购物车中有菜单(餐点、饮料和甜点),我必须尝试打 20% 的折扣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2019-05-11
  • 1970-01-01
  • 2018-05-23
  • 2021-02-13
  • 2021-05-09
相关资源
最近更新 更多