2013-02-13 15 views
5

これはしばらくの間、私は小数点以下を文字列として保存しています。これは、いくつかの計算を実行するために集約フレームワークの使用を開始する必要があるため、問題になりました。Mongoは、文字列として格納されているすべての数値フィールドを変換します。

このような何かが、モンゴシェルから動作するはずの私のコレクション内の各文書を歩くとisNaNために、それぞれの値をチェックし、偽ならばparseFloat

答えて

6

でそれを格納するためにどのような方法があります:

db.yourCollection.find({}).forEach(function(doc) { 
    if(isNaN(doc.xyz)) { 
     print('found string: ' + doc._id); 
     db.yourCollection.update( 
      { _id: doc._id}, 
      { $set : { "xyz" : parseFloat(doc.xyz) } } 
     ) 
    } 
}) 

これは、各文書をループし、提案したとおりにisNaNを使用し、$setsの値を現在の文書のparseFloatの値にします。

+1

mongodb 2.2以降では、更新では最初のパラメータとしてクエリが使用されるため、doc._idではなく{_id:doc._id}になります。 –

+0

'isNaN(doc.xyz) 'の代わりに文字列が" 123 "または" 3456 "の場合は' typeof doc.xyz ==' string''を使用してください。 – ov1d1u

+1

@ ov1d1u - しかし、元の質問は特にisNaNの使用について尋ねたので、それを選択しました。 – WiredPrairie

2

ご回答ありがとうございます。最初の質問では、数値に更新するフィールドを指定する必要はなく、各プロパティを参照してチェックを実行する必要があるという点では不明でした。

私はトリックを行うために一緒にこの小さな機能を入れている:

var cursor = db.results.find(); 
while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    for (key in doc) { 
     if (key.match(/^metric_.*/i) && !isNaN(doc[key])) { 
      doc[key] = parseFloat(doc[key]); 
      db.results.update({ _id : doc._id }, doc); 
     } 
    } 
} 

2つのことに注意する:

  1. これは、プロパティのみの最初のレベルにあるチェックや変換を行います。それは簡単に変更することができますが、これは私が今必要としていたものです。
  2. この関数は日付の値を離れて爆発させます。 JavaScriptの日付はisNaNと評価されているため、数字として扱われます。私の場合、parseFloatを使用すると実際には値はisNaNに設定されます。再び、見物人のための非常に簡単な修正が、私はその放棄を提供したいと思った。

これは私のポジションにいる他の人に役立ちます。

関連する問題