Попытка переименовать поля документа MongoDB с пробелами

Я был немного тупым и создал коллекцию в 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"
}

Я пытаюсь определить функцию в оболочке Монго, чтобы переименовать их:

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, корректно переименовываются, поле метрики остается исходным полем с пробелами.

Есть идеи?


...обновление.

Кажется, что коллекции с метрикой "Avg Xfer /sec" правильно переименовываются в "metric", а коллекции с "Avg I/O /sec" или "Processor Busy %" - нет. Я не совсем уверен, почему это будет.

1 ответ

Решение

Это потому, что обновление переименования ищет свойство с именем '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 );
Другие вопросы по тегам