尝试使用空格重命名MongoDB文档字段

时间:2012-10-01 19:43:25

标签: javascript mongodb mongodb-shell

我有点愚蠢,在MongoDB中创建了一个带有键名称空格的集合:

{
        "_id" : ObjectId("5065f84d00ea10c01e00003f"),
        "DateTime" : ISODate("2012-09-27T15:19:00Z"),
        "Port Name" : "CL3-J",
        "Port Number" : "40",
        "Avg I/O /sec" : "2024.0",
        "array_serial" : "xxxxx"
}

我正在尝试在mongo shell上定义一个函数来重命名它们:

var metricNames = ["Processor Busy %",
                      "Avg I/O /sec",    
                      "Avg Xfer /sec"];


var renameFields = function(collection) {
  var record = db[collection].findOne({});
  var myMetric;

  for (var key in record) {
    if(metricNames.indexOf(key) !== -1){
      myMetric = metricNames[metricNames.indexOf(key)];
      print(myMetric);
      break;
    } else {
      continue;
    }
  }

  db[collection].update( { }, { $rename : { 
                                            'DateTime'    : 'datetime',
                                            'Port Name'        : 'port_name',
                                            'Port Number'      : 'port_number',
                                            'Adaptor ID'       : 'adaptor_id',
                                            'Processor ID'     : 'processor_id',
                                            'Processor Type'   : 'processor_type',
                                             myMetric          : 'metric' } }, false, true );

}

根据指定的集合,度量标准可能是三个中的一个...问题是除了“myMetric”之外的所有指定字段都正确地重命名,度量字段保留带空格的原始字段

有什么想法吗?


......更新。

似乎具有“平均Xfer / sec”度量标准的集合已正确重命名为“metric”,但具有“Avg I / O / sec”或“Processor Busy%”的集合不是。我不完全确定为什么会这样。

1 个答案:

答案 0 :(得分:3)

这是因为重命名更新正在寻找一个名为'myMetric'的属性来重命名而不是一个名为myMetric的值。您需要以编程方式构建重命名对象:

var rename = { 
  'DateTime'    : 'datetime',
  'Port Name'        : 'port_name',
  'Port Number'      : 'port_number',
  'Adaptor ID'       : 'adaptor_id',
  'Processor ID'     : 'processor_id',
  'Processor Type'   : 'processor_type'
};
rename[myMetric] = 'metric';
db[collection].update( { }, { $rename : rename }, false, true );