Преобразовать строку в int в совокупности в mongoDB, используя nodejs - PullRequest
2 голосов
/ 05 мая 2020

Образцы данных, хранящиеся в mongoDB ::

TotalStudent, TotalPresent, все в строке.

[{'_id':'12sdsd','TotalStudent:'1,233,273','TotalPresent':'23'},
{'_id':'22fdf','TotalStudent:'2,445,232','TotalPresent':'32'}]

Node js :: Я попытался агрегировать и выдать мне общее количество студентов и общее количество присутствующих.

PS: Я использовал mon goose для получения данных из mongoDB.

covid_data.aggregate([{
        $group:{
            _id:"",
            TotalStudents:{$sum:{$toInt:"$TotalStudents"}},
            TotalPresent:{$sum:{$toInt:"$TotalPresent"}}
        }
    }], (err,docs)=>{
        if(err){
            console.log(err);
            return res.status(500).send(err);
        }
        else{
            console.log(docs);
            res.send(docs);
        }
    });

Это дает мне ошибку как ::

" Не удалось проанализировать число '1,233,273' в $ convert без значения onError: Bad di git \ ", \" при синтаксическом анализе 1,233,273 "." CodeName ":" ConversionFailure "

Edit1

Формат чисел TotalStudents отредактированных данных выборки. Так как он также содержит , . Раньше мне не удавалось включить TotalStudents, содержащий числа как «1,233,273» и «2,445,232». Из-за чего при попытке преобразования я получаю сообщение об ошибке.

Любая помощь будет очень признательна. Ура !!

1 Ответ

2 голосов
/ 05 мая 2020

Запуск версии MongoDB> = 4.0 вы можете использовать $ toInt для преобразования строки в int, попробуйте следующий код:

covid_data.aggregate([
    {
      $group: {
        _id: "",
        TotalStudents: { $sum: { $toInt: "$TotalStudent" } },
        TotalPresent: { $sum: { $toInt: "$TotalPresent" } }
      }
    }
  ], (err,docs)=>{
    if(err){
        console.log(err);
        return res.status(500).send(err);
    }
    else{
        console.log(docs);
        res.send(docs);
    }
});

Тест: mongoplayground

Примечание: На этапе $group _id должно быть _id: "", чтобы сгруппировать по всем документам (использование _id:"$_id" приведет к при возврате почти тех же данных, поскольку _id уникален для каждого do c). Кроме того, у вас есть пара опечаток в $sum, в {$sum:"TotalPresent"} также в {$Sum:"$TotalStudents"}.

Обновление: Обновленный ответ с новым требованием: поскольку исходный запрос не выполняется из-за наличия ,: '1,233,273'.

db.collection.aggregate([
   /** Re-create two string fields without `,` */
  {
    $addFields: { 
    TotalStudent: {
        $reduce: {
          input: { $split: [ "$TotalStudent", "," ] },
          initialValue: "",
          in: { $concat: [ "$$this", "$$value" ] }
        }
      },
    TotalPresent: {
        $reduce: {
          input: { $split: [ "$TotalPresent", "," ] },
          initialValue: "",
          in: { $concat: [ "$$this", "$$value" ] }
        }
      }
    }
  },
  {
    $group: {
      _id: "",
      TotalStudents: { $sum: { $toInt: "$TotalStudent" } },
      TotalPresent: { $sum: { $toInt: "$TotalPresent" } }
    }
  }
])

Тест: mongoplayground

Нам нужно разделить строку на основе разделителя , и объединить все строки в массиве в одну, используя $reduce. Этого можно избежать, используя $replaceOne стартовую версию MongoDB> = 4.4, проверьте это :: how-to-replace-substring-in-mongodb-document , используйте эту ссылку, если вы хотел обновить данные.

Примечание: Я настоятельно рекомендую рассмотреть мой вышеупомянутый комментарий:

Итак, концепция, о которой все говорят, заключается в следующем: напишите это один раз в идеальном виде, чтобы прочитать его n раз с легкостью ... Итак, теперь нам нужно проделать n количество приемов, чтобы заставить его работать каждый раз, когда мы его читаем. Итак, вы хотите обновить все данные числами? - Я бы сказал сделать это или даже могу предоставить запрос, который будет работать, но я бы не стал отказываться от обновления данных до правильного формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...