【问题标题】:Convert string to int in aggregate in mongoDB using nodejs使用nodejs在mongoDB中将字符串转换为int
【发布时间】:2020-05-05 14:56:31
【问题描述】:

存储在 mongoDB 中的示例数据::

TotalStudent,TotalPresent 都是字符串。

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

Node js:: 我尝试聚合并给我学生总数和在场总数的输出。

P.S.:我使用 mongoose 从 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);
        }
    });

它给我的错误是:

“在没有 onError 值的情况下无法解析 $convert 中的数字‘1,233,273’:解析 1,233,273 时数字错误 \",\"。"codeName":"ConversionFailure"

编辑1

编辑样本数据的 TotalStudents 数字格式。因为它还包含。 以前我未能将 TotalStudents 包含的数字包含为“1,233,273”和“2,445,232”。因为在尝试转换时出现了错误。

任何帮助将不胜感激。干杯!!

【问题讨论】:

  • 数据类型很重要,在创建集合时使用数字而不是字符串,至少在数据库实例中是这样。如果您的数据以这种方式出现,您在导入时始终可以以不同的方式处理它。如果你不这样做,你最终会遇到解决方法的世界末日而不是查询。
  • 问题是我从网站上抓取数据并从那里获取数据。并将数据存储在 mongoDb 中。因此我无法控制它保存数据的类型
  • 我非常了解您,但如果您想要可靠的结果,您的数据必须经过清理。如果您所做的是“一次性”操作,您可以冒险跳过它,但是......如果您的数据是增量的,则可能需要一个修复一致性的层。
  • @Ajax 如果您废弃了数据,这意味着您可以控制数据如何进入数据库。否则,您可能需要遍历数据并在应用层将其更新为适当的格式。
  • 谢谢大家的回复.....我会将我的数据更新为适当的格式,这是最佳实践。我会接受@whoami 的回答,因为它适用于格式正确的数据。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

启动 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 对于每个文档都是唯一的)。另外,$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 num 每次我们阅读它时让它工作的技巧,所以你想更新 所有带有数字的数据? - 我会说去做,甚至我可以提供一个 查询可以工作,但我不会选择它来更新数据 格式正确。

【讨论】:

  • 我已将我的问题编辑为我的号码,在这种情况下是一个字符串,它还包含“,”,因为它无法转换,所以我没有包含它。请你看看并建议我。
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2013-09-26
  • 2014-06-27
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多