MongoDB类型从NumberLong更新为String

时间:2017-03-02 19:55:21

标签: mysql node.js mongodb csv 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
到目前为止我已经尝试过了:

  • 将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()thisthis {"N",u","m","b","e","r","L","o","n","g"..}尝试了很多解决方案  等


对于我尝试的最后一个例子,我没有字符串,但是对象,NumberLong但是我希望它是“123456789”,而不是对象。
我正在使用MongoDB 3.4 this 所以,我的问题是,如何将“字段”类型从String更改为message = format_html( '''<div> <p>{0} wants to join {1}!</p> {% url 'accounts:detail' pk={2} as profile_url %} <p> View their <a href="{{ profile_url }}">profile</a> </p> <div>Approve</div> <div>Deny</div> </div> ''', self.request_user.username, self.lab.name, self.request_user.pk)

2 个答案:

答案 0 :(得分:10)

您可以使用valueOf()将NumberLong的值作为javascript数值。

将NumberLong转换为数字:

NumberLong('5').valueOf() // 5

然后,您可以在数字上使用easilly toString()来获取字符串值。

将NumberLong转换为字符串:

NumberLong('5').valueOf().toString() // "5"

答案 1 :(得分:2)

存在类型NumberLong的原因是为了处理大量数字,类似于SQL上的BigInt。 MongoDB依赖于JavaScript,该JavaScript最多具有53个整数位,在ES6中,最大的精确整数值为2 53 -1或9007199254740991,因此,将NumberLong转换为简单字符串是不可行的。不像前面的答案那么简单,这是一个例子:

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使用特殊的字符$将值转换为对象,以表示在处理值时要调用的函数,MongoDB在处理日常日常事务时处理此问题的方式JSON对象:

JSON.stringify(huge) // {"$numberLong":"987654321987654321"}