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
.
到目前为止我已经尝试过:
- 将 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()
的解决方案,比如 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});
我已将 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()
的解决方案,比如 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});