在节点js和mongodb中计算订单总价

Posted

技术标签:

【中文标题】在节点js和mongodb中计算订单总价【英文标题】:Calculate order total price in node js and mongodb 【发布时间】:2021-05-13 14:47:29 【问题描述】:

我用Node JS和MongoDB构建了一个订单系统,我想在服务器中计算订单total_price,然后将其保存为新订单,

let ref = (model) => 
  return  type: mongoose.Schema.Types.ObjectId, required: true, ref: model ;
;

这是我的order 模型架构


  items: [
    
      id: ref("menu_item"),
      count: String,
      size: String,
      options: [String],
    ,
  ],
  total_price: String,
  tip: String,
;

这是menu_item 模型架构


  name: String,
  price: String,
  vat: String, // 3%
  size: [
    
      name: String,
      unit: String,
      price: String,
      vat: String, // 3%
      in_stock: Boolean,
      is_default: Boolean,
    ,
  ],
  options: [
    
      title: String,
      options: [
        
          name: String,
          price: String,
          vat: String, // 3%
          in_stock: Boolean,
          is_default: Boolean,
        ,
      ],
    ,
  ],

这怎么可能? 这是我尝试过的一些方法,但方法错误。

当客户发送订单时,此函数将被调用

async (req, res) => 
      let total = 0;
      let size_price = 0;
      let options_price = 0;
      
      let 
        items,
        tip,
       = req.body;

      let price = 0;
      let item_price = items.forEach(async (el) => 
        let menu_item = await req.models.menu_item.findOne( _id: el.id );
        price += parseInt(menu_item.price);
        console.log(menu_item.price) // first 12 second 9
        console.log(price) // first 12 second 21
      );
      

      console.log(price) // return 0

【问题讨论】:

【参考方案1】:

forEach 循环在执行下一次迭代/退出循环之前不会等待异步函数完成。为了等到从数据库中查询到所有记录并更新price 值,我们可以将所有承诺包装在Promise.all 中,或者在for-of 循环中串行执行它们。

这是使用Promise.all的更新代码:

async (req, res) => 
      let total = 0;
      let size_price = 0;
      let options_price = 0;
      
      let 
        items,
        tip,
       = req.body;

      let price = 0;
      await Promise.all(items.map(async (el) => 
          let menu_item = await req.models.menu_item.findOne( _id: el.id );
          price += parseInt(menu_item.price);
          console.log(menu_item.price) // first 12 second 9
          console.log(price) // first 12 second 21
        )
      );
      

      console.log(price) // return 0

【讨论】:

以上是关于在节点js和mongodb中计算订单总价的主要内容,如果未能解决你的问题,请参考以下文章

使用节点 js 进行 Mongodb 复制

如何计算订单总价?

mongodb 在全文搜索期间使用节点 js 返回 [] 作为响应

Mongo查询返回每个节点的最后更新时间

Mongo查询返回每个节点的最后更新时间

docker compose 将 mongodb 容器与节点 js 容器连接起来