如何在DB-NodeJs中计算并返回更新的新数量

问题描述 投票:0回答:2

我正在尝试计算并返回一个newQty来传递它以便在DB中进行更新。看起来我正在获得NaN fornewQty。让我知道我到底做错了什么。在这里你可以找到console.log:

  • console.log('order type:' + orderType)order类型:卖
  • console.log('new qty:' + qty)新数量:300
  • console.log('old qty:' + typeof oldQty)旧数量:对象
  • console.log('old qty:' + oldQty.toString()) old qty:{qtyPorfolio:500}
  • 减号后的console.log('new qty after minus:' + qty)new数量:-300

JavaScript的

const fetchQtyPortfolio = async (arg) => {
  try {
    const query = { symbol: arg.symbol }
    const projection = { _id: 0 }

    const orderType = arg.orderType
    console.log('order type:' + orderType)// Sell

    let qty = arg.qty
    console.log('new qty:' + qty)// 300

    let oldQty = await Portfolio.find(query, projection).select("qtyPorfolio")
    console.log('old qty:' + typeof oldQty)// object
    console.log('old qty:' + oldQty.toString()) // {qtyPorfolio: 500}
    console.log('old qty:' + JSON.stringify(oldQty))//old qty:[{"qtyPorfolio":500}]

    if (isEmpty(oldQty)) {// false
      // Object is empty (Would return true in this example)
      console.log('new qty:' + qty)
      return qty
    } else {
      // Object is NOT empty
      if (orderType === 'Sell') qty = Math.abs(qty) * -1
      console.log('new qty after minus:' + qty)// -300
      const { qtyPorfolio } = oldQty//???
      console.log('qtyPorfolio :' + qtyPorfolio)// undefined
      console.log('qtyPorfolio :' + typeof qtyPorfolio)// undefined
      return newQty = qtyPorfolio + qty// ???
    }
  } catch (ex) {
    console.log(`fetchQtyPortfolio error: ${ex}`)
  }
}

调节器

exports.postAddTransaction = async (req, res) => {
  const arg = req.body

  const qtyPorfolio = await portfolio.fetchNewQtyPortfolio(arg)
  console.log('quantity portfolio ' + qtyPorfolio)//quantity portfolio NaN

  res.render('buysell')
}

根据@Amir Wagner的解决方案我改变了将返回对象数组的find()改为只返回一个对象的findOne()

const fetchQtyPortfolio = async (arg) => {
  try {
    const orderType = arg.orderType
    let qty = parseInt(arg.qty)

    const query = { symbol: arg.symbol }
    const projection = { _id: 0 }

    const oldQty = await Portfolio.findOne(query, projection).select("qtyPorfolio")
    //findOne returns the Object{} without the Array
    console.log('old qty:' + typeof oldQty)
    console.log('old qty:' + JSON.stringify(oldQty))

    if (isEmpty(oldQty)) {
      // Object is empty (Would return true in this example)
      return qty
    } else {
      // Object is NOT empty
      if (orderType === 'Sell') qty = Math.abs(qty) * -1
      const { qtyPorfolio } = oldQty
      return newQty = qtyPorfolio + qty
    }
  } catch (ex) {
    console.log(`fetchQtyPortfolio error: ${ex}`)
  }
}
javascript node.js mongodb
2个回答
1
投票

由于oldQty包含[{"qtyPorfolio":500}],一个数组,您只需要访问它:

const qtyPorfolio = oldQty[0].qtyPorfolio;

如果你想使用array destructuring(我不愿意)它将是:

const [firstResult] = oldQty
return newQty = firstResult.qtyPorfolio + qty

但是远远优越的解决方案(你自己发现)是使用findOne返回单个文档,而不是find


2
投票

这就是问题

const { qtyPorfolio } = oldQty

简单地做

 qtyPorfolio = oldQty[0].qtyPorfolio;

解构不是那样的。您可以从类似的对象中获取属性,但不能从数组中获取属性。显然,你的oldQty是一个包含一个对象的数组。

© www.soinside.com 2019 - 2024. All rights reserved.