我已经将CSV文件导入了我的mongoDB。CSV具有根据需要的分离器,并通过此查询从MySQL数据库中收到:
SELECT * FROM csgo_users INTO OUTFILE 'b1.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n';
另外,我尝试从续集Pro接收具有其导出功能的CSV。
在我的CSV中,我有17个字符长的字段。在MySQL数据库中,此字段具有VARCHAR类型,但包含17位数字。
在将CSV导入Mongo之后,我使用了NumberLong
类型的字段,但我希望它是string
。
我已经尝试过:
- MySQL中的更改类型从
varchar
到text
。 - 尝试使用其他标志
--headerline
和--columnsHaveTypes
导入CSV - 还尝试使用标签
--fields
。 尝试命令:
db.csgo_users.find({"steam_id": {$type: 18}}) .toArray() .map(function(v){ v.steam_id = new String(v); db.csgo_users.save(v) })
或以下:
db.csgo_users.find({"steam_id": {$type: 18}})
.toArray()
.map(function(v){
v.steam_id = new String(v.toSring());
db.csgo_users.save(v)
})
- 我尝试了很多forEach()
的解决方案, 等。
在我的尝试的最后一个示例中,我没有字符串,而是对象,{"N",u","m","b","e","r","L","o","n","g"..}
,但我希望它是" 123456789",而不是对象。
我正在使用mongodb 3.4文档。
,我的问题是,如何将"字段"类型从NumberLong
更改为String
?
您可以使用valueof()将数字的值作为JavaScript编号值。
铸造号码为数字:
NumberLong('5').valueOf() // 5
然后,您可以在您的电话号码上使用Easilly toString()
获取字符串值。
铸造数字到字符串:
NumberLong('5').valueOf().toString() // "5"
存在类型NumberLong
是有原因的,要处理大量数字,类似于SQL上的BigInt
。MongoDB依靠JavaScript,最多有53位整数位,在ES6中,最大的确切积分值为2 53 -1或9007199254740991,因此,"转换"从数字到简单的字符串并不像以前的答案那样简单,以下是一个示例:
var huge = NumberLong("987654321987654321");
huge.valueOf(); // 987654321987654300
huge.toString(); // NumberLong("987654321987654321")
huge.valueOf().toString(); // 987654321987654300
在此示例中,很明显,JavaScript在使用valueOf()
时正在汇总数字,并且缺乏任何明智的响应和文档,我在这种情况下进行了解决方法,使用Regex从toString()
函数中删除任何非数值字符:
huge.toString().replace(/[^d]/g, '') // 987654321987654321
它并不漂亮,但是它可以运行,任何其他更好的解决方案始终受到赞赏。作为奖励事实,使用JSON.stringify
使用特殊的char $
将值转换为对象,以表示要在处理该值时调用的函数,而MongoDB处理此问题的方式在处理常见的日常日常JSON对象时:
JSON.stringify(huge) // {"$numberLong":"987654321987654321"}
更新:使用mongoDB转换数据的正确方法是使用投影与聚合:
db.getCollection('mycollection').aggregate([
{$match: {
/* your match query object */
}},
{$project: {
_id: 0, // to ignore the document id
myStringObj: {$toString: '$myNumberLongObj'} // from NumberLong to String
}},
], {allowDiskUse: true});