MongoDB将字符串类型转换为浮点类型。
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" }
问题出现的原因是在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中的字符串类型字段转换为浮点数类型,从而解决相关的问题。
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进行批量更新操作,可以提高性能,减少与服务器的通信次数,从而更高效地将字符串类型的字段转换为浮点数类型。
问题的原因是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
感谢详细的回答。