将MongoDB字段类型从字符串更新为带小数的数字

时间:2016-12-28 13:35:19

标签: mongodb database

我有以下格式的数据。所有字段都存储为字符串。我需要将amount字段设置为Double格式。

{
    "_id" : "soZkg8bvRfM6DHxgW", // string
    "itemId" : "1",              // string
    "amount" : "3113.40",        // string
    "type" : "Travel"            // string
}

我尝试了此操作,但在更新后,amount的值为3113.00,而不是3113.40

db.collection.find().forEach( function (x) {
  x.amount = parseInt(x.amount).toFixed(2); 
  db.collection.save(x);
});

那么如何将字符串转换为支持数字的数字格式,并且不重置当前的十进制值?或者我应该使用其他格式?

我需要能够使用金额数据进行聚合。

1 个答案:

答案 0 :(得分:0)

会说批量操作,因为它们允许执行批量更新操作,这些操作只是服务器顶部的抽象,可以轻松构建批量操作,从而简化您的更新。

随着 bulk API 批量发送写入操作,您可以获得超过大型集合的性能提升,甚至更好,它会为您提供有关成功和失败的真实反馈。

在批量更新中,使用 parseFloat() 来解析字符串值并返回浮点数。您还需要首先过滤集合以优化更新,并将更新操作分批发送到服务器500,这样可以提供更好的性能,因为您不是每次向服务器发送每个请求,每500个请求中只有一次:

var cursor = db.collection.find({
        "amount": { 
            "$exists": true, 
            "$type": 2 
        }
    }),
    bulkUpdateOps = [];

cursor.forEach(function(doc){ 
    bulkUpdateOps.push({ 
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { 
                "$set": { "amount": parseFloat(doc.amount) }
            }
        }
    });

    if (bulkUpdateOps.length === 500) {
        db.collection.bulkWrite(bulkUpdateOps);
        bulkUpdateOps = [];
    }
});         

if (bulkUpdateOps.length > 0) 
    db.collection.bulkWrite(bulkUpdateOps)