при использовании $ convert с условием null и ошибкой вывод по-прежнему NaN - PullRequest
0 голосов
/ 23 января 2019

Я столкнулся с проблемой с агрегацией в mongodb, так как я группирую результат и суммирую его, преобразовываю поданное в двойное число и помещаю в Error или On null, я возвращаю 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 
}]

1 Ответ

0 голосов
/ 28 января 2019

Недостаточно доказательств того, что вы предоставили здесь для решения проблемы.

Вычисления Prices и Invoices идентичны, поэтому проблем не должно быть.

Единственная оставшаяся часть - это данные - в них должно быть что-то, что их вызывает.Если набор данных большой, вы можете попробовать запустить его с меньшим набором, чтобы убедиться, что ваш код правильный.

Вы можете попробовать метод бинарной резки (https://en.wikipedia.org/wiki/Binary_search_algorithm). Возьмите половину ваших данных и запустите их. Если проблема не появляется, это означает, что проблема в другой половине данныхЕсли он все еще появляется, снова наполовину данные и повторяйте этот процесс, пока он не будет работать нормально.

В тот момент, когда он начинает работать, вы знаете, что проблема в другой половине данных, поэтому идитевернемся к этому и наполовину снова. Надеюсь, это имеет смысл для вас. Это эффективный способ определить, какая запись вызывает проблему.

...