Gry*_*ets 5 mysql csv mongodb node.js mongo-shell
我已将CSV文件导入我的mongodb.CSV具有mongo所需的分隔符,并且通过此查询从MySQL数据库接收:
SELECT * FROM csgo_users INTO OUTFILE 'b1.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
我也尝试使用它的导出功能从Sequel Pro接收CSV.
在我的csv中,我有一个长度为17个字符的字段.在MySQL数据库中,此字段的类型为VARCHAR,但包含17位数字.
将csv导入到mongo之后,我得到了这个类型的字段NumberLong,但我希望它是string.
我到目前为止尝试过:
varchar为text.--headerline和--columnsHaveTypes--fields.试过这样的命令:
db.csgo_users.find({"steam_id": {$type: 18}})
.toArray()
.map(function(v){
v.steam_id = new String(v);
db.csgo_users.save(v)
})
Run Code Online (Sandbox Code Playgroud)或这个:
db.csgo_users.find({"steam_id": {$type: 18}})
.toArray()
.map(function(v){
v.steam_id = new String(v.toSring());
db.csgo_users.save(v)
})
Run Code Online (Sandbox Code Playgroud)
-我已经尝试了很多解决方案与forEach()像这样或这样或本
等.
对于我尝试的最后一个例子,我没有字符串,但是对象,{"N",u","m","b","e","r","L","o","n","g"..}但是我希望它是"123456789",而不是对象.
我正在使用MongoDB 3.4 文档.
所以,我的问题是,如何将"字段"类型更改NumberLong为String?
您可以使用valueOf()将NumberLong的值作为javascript数值.
将NumberLong转换为Number:
NumberLong('5').valueOf() // 5
Run Code Online (Sandbox Code Playgroud)
然后,您可以toString()在数字上使用easilly 来获取String值.
将NumberLong转换为String:
NumberLong('5').valueOf().toString() // "5"
Run Code Online (Sandbox Code Playgroud)
该类型的NumberLong存在是有原因的,为了处理巨大的数字,类似于BigIntSQL。MongoDB 依赖的 JavaScript 最多有 53 位整数,在 ES6 中最大的精确整数值为 2 53 -1,即 9007199254740991,因此,从 NumberLong“转换”为简单字符串并不像前面那么简单回答,这是一个例子:
var huge = NumberLong("987654321987654321");
huge.valueOf(); // 987654321987654300
huge.toString(); // NumberLong("987654321987654321")
huge.valueOf().toString(); // 987654321987654300
Run Code Online (Sandbox Code Playgroud)
通过这个例子,很明显 JavaScript 在使用时对数字进行四舍五入valueOf(),并且缺乏任何理智的响应和文档,我为这种情况提供了一个解决方法,使用 RegEx 从函数中删除任何非数字字符toString():
huge.toString().replace(/[^\d]/g, '') // 987654321987654321
Run Code Online (Sandbox Code Playgroud)
它并不漂亮,但它有效,任何其他更好的解决方案总是值得赞赏的。作为一个额外的事实,使用JSON.stringify使用特殊字符将值转换为对象$来表示处理值时要调用的函数,MongoDB 在处理常见的日常 JSON 对象时处理此问题的方式:
JSON.stringify(huge) // {"$numberLong":"987654321987654321"}
Run Code Online (Sandbox Code Playgroud)
更新: 使用 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});
Run Code Online (Sandbox Code Playgroud)