MongoDB将字符串类型转换为浮点类型。

8 浏览
0 Comments

MongoDB将字符串类型转换为浮点类型。

参考这里的建议MongoDB:如何更改字段的类型?,我尝试更新我的集合以更改字段的类型和值。\n以下是更新查询\n

db.MyCollection.find({"ProjectID" : 44, "Cost": {$exists: true}}).forEach(function(doc){
    if(doc.Cost.length > 0){
        var newCost = doc.Cost.replace(/,/g, '').replace(/\$/g, '');
        doc.Cost =  parseFloat(newCost).toFixed(2);  
        db.MyCollection.save(doc);
        } // If条件结束
    }) // foreach循环结束

\n完成上述查询后,当我运行以下命令时\n

db.MyCollection.find({"ProjectID" : 44},{Cost:1})

\n我仍然将Cost字段作为字符串。\n

{
    "_id" : ObjectId("576919b66bab3bfcb9ff0915"),
    "Cost" : "11531.23"
}
/* 7 */
{
    "_id" : ObjectId("576919b66bab3bfcb9ff0916"),
    "Cost" : "13900.64"
}
/* 8 */
{
    "_id" : ObjectId("576919b66bab3bfcb9ff0917"),
    "Cost" : "15000.86"
}

\n我在这里做错了什么?\n这是样本文档\n

/* 2 */
{
    "_id" : ObjectId("576919b66bab3bfcb9ff0911"),
    "Cost" : "$7,100.00"
}
/* 3 */
{
    "_id" : ObjectId("576919b66bab3bfcb9ff0912"),
    "Cost" : "$14,500.00"
}
/* 4 */
{
    "_id" : ObjectId("576919b66bab3bfcb9ff0913"),
    "Cost" : "$12,619.00"
}
/* 5 */
{
    "_id" : ObjectId("576919b66bab3bfcb9ff0914"),
    "Cost" : "$9,250.00"
}

0
0 Comments

问题出现的原因是在MongoDB中,某些字段的数据类型为字符串(string),但需要将其转换为浮点数(float)类型。这可能是由于数据导入或更新过程中的错误导致的。

解决方法是使用MongoDB版本4.2及以上的更新功能来实现。可以使用聚合管道(Aggregation Pipeline)中的更新操作来完成这个任务。在更新操作中,使用$toDouble聚合运算符将字符串字段转换为浮点数。具体操作如下:

db.collection.updateMany(
  {Cost: {$exists: true}},
  [{$set: {
      Cost: {
        $toDouble: {
          $reduce: {
            input: {$split: [{$substr: ["$Cost", 1, {$strLenCP: "$Cost"}]}, ","]},
            initialValue: "",
            in: {$concat: ["$$value", "$$this"]}
          }
        }
      }
  }}]
)

以上代码中,首先使用updateMany方法选择所有包含字段"Cost"的文档。然后,使用$set操作符将"Cost"字段的值进行转换。在转换过程中,使用$substr和$strLenCP运算符获取字符串的子字符串,并使用$split运算符将其拆分为一个字符串数组。接下来,使用$reduce运算符将字符串数组中的元素连接起来,形成一个新的字符串。最后,使用$toDouble将新的字符串转换为浮点数,并将其赋值给"Cost"字段。

如果想要查看这个解决方法的示例效果,可以访问MongoDB Playground中的示例链接

通过以上操作,我们可以将MongoDB中的字符串类型字段转换为浮点数类型,从而解决相关的问题。

0
0 Comments

MongoDB convert string type to float type问题的出现原因是需要将字符串类型的货币字段转换为浮点数类型。解决方法是使用Bulk API进行批量更新。

在MongoDB版本2.6到3.2之间,可以使用Bulk API进行批量更新操作。首先,通过查询所有字段类型为字符串的文档来找到需要更新的文档。然后,使用正则表达式和Number函数将字符串类型的Cost字段转换为浮点数。接下来,使用Bulk API的initializeUnorderedBulkOp方法创建一个批量操作对象bulk,并将每个文档的更新操作添加到bulk中。当累积到一定数量的更新操作时,执行bulk.execute()方法将批量操作发送给服务器进行更新。最后,需要注意在循环结束时执行bulk.execute()方法以清除剩余的操作。

在MongoDB版本3.2及以上,Bulk API已被弃用,改为使用bulkWrite()方法进行批量更新。方法与上述类似,首先查询需要更新的文档,然后使用forEach()方法将每个文档的更新操作添加到bulkUpdateOps数组中。当累积到一定数量的更新操作时,使用db.MyCollection.bulkWrite()方法将批量操作发送给服务器进行更新。同样需要注意在循环结束时执行db.MyCollection.bulkWrite()方法以清除剩余的操作。

其中,Number()函数用于将字符串转换为数值类型,"$type": 2用于选择字段类型为字符串的文档。

通过使用Bulk API进行批量更新操作,可以提高性能,减少与服务器的通信次数,从而更高效地将字符串类型的字段转换为浮点数类型。

0
0 Comments

问题的原因是toFixed返回的是一个String,而不是一个Number。然后,你只是用一个新的、不同的String更新了文档。

解决方法是使用类似的方法再次解析为2位小数的数字。具体代码如下:

db.MyCollection.find({"ProjectID" : 44, "Cost": {$exists: true}}).forEach(function(doc){
  if(doc.Cost.length > 0){
    var newCost = doc.Cost.replace(/,/g, '').replace(/\$/g, '');
    var costString = parseFloat(newCost).toFixed(2);
    doc.Cost = parseFloat(costString);
    db.MyCollection.save(doc);
  } // End of If Condition
}) // End of foreach

感谢详细的回答。

0