我有以下格式的数据。所有字段都存储为字符串。我需要将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);
});
那么如何将字符串转换为支持数字的数字格式,并且不重置当前的十进制值?或者我应该使用其他格式?
我需要能够使用金额数据进行聚合。
答案 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)