Type-Conversion

mongodb:將字元串欄位更新為整數

  • March 15, 2019

我有一個集合,其中包含一些應該是整數的欄位。由於軟體錯誤,其中一些值是字元串。我需要轉換它們。這是一個範例文件:

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。

引用自:https://dba.stackexchange.com/questions/212425