Type-Conversion
mongodb:將字元串欄位更新為整數
我有一個集合,其中包含一些應該是整數的欄位。由於軟體錯誤,其中一些值是字元串。我需要轉換它們。這是一個範例文件:
var coll = db.getCollection('info'); coll.find({ id: "985517" });
結果:
{ "_id" : "41cbb4e48284c0612a1c4b3ee5e3e2720c01197a", "id" : "985517", "title" : "009_1a.jpg", "ext" : ".jpg", "content_type" : "image/jpeg; charset=utf-8", "sha1" : "41cbb4e48284c0612a1c4b3ee5e3e2720c01197a", "has_thumb" : true, "size" : 2917, "width_px" : "70", "height_px" : "69" }
我嘗試將 width_px 和 height_px 值轉換為整數。我的第一次天真嘗試:
var coll = db.getCollection('info'); var bulk = coll.initializeOrderedBulkOp(); var counter = 0; coll.find({ width_px: { $type: "string" }, id: "985516" }).limit(100).forEach(function(data) { var updoc = { "$set": {} }; updoc["$set"]["width_px"] = parseInt(data.width_px); // queue the update bulk.find({ "_id": data._id }).update(updoc); counter++; // Drain and re-initialize every 1000 update statements if (counter % 1000 == 0) { bulk.execute(); bulk = coll.initializeOrderedBulkOp(); } }) // Add the rest in the queue if (counter % 1000 != 0) bulk.execute();
結果令人失望:
{ "_id" : "41cbb4e48284c0612a1c4b3ee5e3e2720c01197a", "id" : "985517", "title" : "009_1a.jpg", "ext" : ".jpg", "content_type" : "image/jpeg; charset=utf-8", "sha1" : "41cbb4e48284c0612a1c4b3ee5e3e2720c01197a", "has_thumb" : true, "size" : 2917, "width_px" : 70.0, "height_px" : "69" }
所以它被更新為加倍,而不是 int32。我知道在 JavaScript 中,沒有單獨的雙精度和整數類型,只有“數字”。但我需要更新 100 000 個文件,並且我想高效地完成此操作。
但是怎麼做?
解決方案是使用 NumberInt 而不是 parseInt。
var coll = db.getCollection('info'); var bulk = coll.initializeOrderedBulkOp(); var counter = 0; coll.find({ width_px: { $type: "string" }}).forEach(function(data) { var updoc = { "$set": {} }; updoc["$set"]["width_px"] = NumberInt(data.width_px); // queue the update bulk.find({ "_id": data._id }).update(updoc); counter++; // Drain and re-initialize every 1000 update statements if (counter % 1000 == 0) { bulk.execute(); bulk = coll.initializeOrderedBulkOp(); } }) // Add the rest in the queue if (counter % 1000 != 0) bulk.execute();
它將構造一個特定於 mongodb 的新 NumberInt 對象,並將其序列化為 int32。