MongoDB类型从NumberLong更新为String

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.
我到目前为止尝试过:

  • 将MySQL中的类型更改varchartext.
  • 试图导入csv与额外的标志--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 文档.
所以,我的问题是,如何将"字段"类型更改NumberLongString

Jul*_*SIN 9

您可以使用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)


Rod*_*olo 6

该类型的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)