因业务需要,使用canal同步数据时,将mysql数据同步至mongodb时,有些数据类型是int,但保存时却为string,所以需要进行手工转换。
mongodb版本差异很大,4.0以下的低版本的方案一般是:
db.my_collection.find().forEach( function(obj) { obj.my_value= new NumberInt(obj.my_value); db.my_collection.save(obj); });
但这种方案在4.0是无效的,因此笔者尝试了多种方法:
此种方法是有效的,并且支持多个字段进行修改,主要参考文章:https://stackoverflow.com/questions/59808898/mongodb-convert-element-data-type-from-numeric-string-to-number-for-a-large-col
db.SurName.aggregate([
{
$addFields: {
field1: {$toInt: "$field1"},
field2: {$toInt: "$field2"}
}
},
{$out: "SurName"}
])
以下方案也是有效的,但是笔者没找到怎么修改多字段的数据类型,主要参考文章: https://stackoverflow.com/questions/4973095/how-to-change-the-type-of-a-field
db.orders.drop(); db.orders.insertMany( [ { _id: 1, item: "apple", qty: "5", price: 10 }, { _id: 2, item: "pie", qty: "10", price: NumberDecimal("20.0") }, { _id: 3, item: "ice cream", qty: "2", price: "4.99" }, { _id: 4, item: "almonds" , qty: "5", price: 5 } ] ) var bulkOps = []; db.orders.find({}).forEach(function (doc) { var q = parseInt(doc.qty); bulkOps.push( { "updateOne": { "filter": {"_id": doc._id}, "update": {"$set": {"qty": q}} } } ); }) db.orders.bulkWrite(bulkOps);