当使用$convert条件为空并出错时,输出仍然是 NaN



>我在mongodb中遇到聚合问题,因为我对结果进行分组并将其求和,并将归档文件加倍并放在错误或空值上,我返回0但输出NaN

let $match= {
  $and:[{
    status:{ $in:['Completed'] }
  },{
    type:0
  }, {
    "price": { "$exists": true, "$ne": null }
  },{
    "invoice_value": {
      "$exists": true, "$ne": null
    }
  }]
};
if(Object.keys(query).length>0){
  console.log(query);
  $match.$and.push(query);
}
try {
  const res = await Order.aggregate([
    { $match },
    {
      $group: {
        _id: null,
        Prices: {
          $sum: {
            $convert:
              {
                input: '$price',
                to: 'double',
                onError: 0,
                onNull: 0
              }
          }
        },
        Invoices: {
          $sum: {
            $convert:
              {
                input: '$invoice_value',
                to: 'double',
                onError: 0,
                onNull: 0
              }
          }
        },
        count: {
          $sum: 1
        }
      }
    }
  ])
}catch (e) {
  console.error(e);
}

输出:

[{ 
  _id: null, 
  Prices: NaN, 
  Invoices: 834565.92, 
  count: 25211 
}]

您在此处提供的证据不足以解决问题。

PricesInvoices的计算是相同的,所以应该不是问题。

唯一剩下的部分是数据 - 其中一定有什么东西导致了它。如果数据集很大,您可以尝试使用较小的数据集运行它,以验证您的代码是否正确。

您可以尝试二进制切碎方法 (https://en.wikipedia.org/wiki/Binary_search_algorithm)。获取一半的数据并运行它。如果问题没有出现,则表示问题出在数据的另一半。如果仍然出现,请再次减半数据,然后重复此过程,直到它正常工作。

它开始工作的那一刻,你知道问题出在数据的另一半,所以回到那一半,再说一半。我希望这对你有意义。这是确定导致问题的记录的有效方法。

相关内容

最新更新