zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mongodb 修改数据类型 版本4.0 (string to int)

MongoDB string to 版本 修改 数据类型 int 4.0
2023-09-14 09:00:18 时间

因业务需要,使用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);