2

私は少し愚かで、キー名にスペースを使用して 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シェルで関数を定義しようとしています:

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 );

}

指定されたコレクションに応じて、メトリックは 3 つのうちの 1 つになる可能性があります...問題は、「myMetric」以外の指定されたすべてのフィールドの名前が正しく変更されていることです。メトリック フィールドはスペースを含む元のフィールドのままです。

何か案は?


...アップデート。

「Avg Xfer /sec」メトリックのコレクションは「metric」に適切に名前が変更されているようですが、「Avg I/O /sec」または「Processor Busy %」のコレクションはそうではありません。それがなぜなのか、私にはよくわかりません。

4

1 に答える 1

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 );
于 2012-10-01T20:22:57.070 に答える