MongoDB 类型从 NumberLong 更新为 String

MongoDB type update from NumberLong to String

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

或者这个:

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() 的解决方案,比如 this or this or this 等等


对于我尝试的最后一个例子,我得到的不是字符串,而是对象,{"N",u","m","b","e","r","L","o","n","g"..} 但我希望它是“123456789”,而不是对象。
我正在使用 MongoDB 3.4 docs.
所以,我的问题是,如何将 "field" 类型从 NumberLong 更改为 String

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

将 NumberLong 转换为 Number :

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

然后,您可以在您的号码上轻松使用 toString() 来获取字符串值。

将 NumberLong 转换为字符串:

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

NumberLong 类型的存在是有原因的,它可以处理巨大的数字,类似于 SQL 上的 BigInt。 MongoDB 依赖于 JavaScript,它最多有 53 位整数,在 ES6 中,最大的精确整数值为 253-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"}

更新: 使用 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});