Hi_Amos
坚持每天都在进步!!
随笔 - 224,  文章 - 2,  评论 - 192,  阅读 - 94万

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

 

posted on   Hi_Amos  阅读(861)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2014-06-13 Android学习---SQLite数据库的增删改查和事务(transaction)调用

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示