【问题标题】:MongoDB type update from NumberLong to StringMongoDB 类型从 NumberLong 更新为 String
【发布时间】:2017-07-22 17:29:42
【问题描述】:

我已将 CSV 文件导入我的 mongodb。 CSV 具有 mongo 所需的分隔符,并通过以下查询从 MySQL 数据库接收:
SELECT * FROM csgo_users INTO OUTFILE 'b1.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
我还尝试使用 Sequel Pro 的导出功能从 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() 尝试了很多解决方案,例如thisthisthis 等等


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

【问题讨论】:

    标签: mysql mongodb csv mongo-shell


    【解决方案1】:

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

    将 NumberLong 转换为 Number :

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

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

    将 NumberLong 转换为字符串:

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

    【讨论】:

    • 你能告诉我mongo shell查询的例子吗?我可以在哪里使用.valueOf()?因为我想选择我的字段为$type: 18NumberLong 的所有字段,然后替换为相同的值但.toString()
    • 我知道了,只是用 .valueOf() 更改了我的代码。非常感谢!
    • 如果它是一个长数字,它会回归到一个不准确的数字
    【解决方案2】:

    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});
    

    【讨论】:

    • 在正则表达式中,\D\d 的反义词,所以可以写得稍微短一些:huge.toString().replace(/\D/g,"")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多