これはしばらくの間、私は小数点以下を文字列として保存しています。これは、いくつかの計算を実行するために集約フレームワークの使用を開始する必要があるため、問題になりました。Mongoは、文字列として格納されているすべての数値フィールドを変換します。
このような何かが、モンゴシェルから動作するはずの私のコレクション内の各文書を歩くとisNaN
ために、それぞれの値をチェックし、偽ならばparseFloat
これはしばらくの間、私は小数点以下を文字列として保存しています。これは、いくつかの計算を実行するために集約フレームワークの使用を開始する必要があるため、問題になりました。Mongoは、文字列として格納されているすべての数値フィールドを変換します。
このような何かが、モンゴシェルから動作するはずの私のコレクション内の各文書を歩くとisNaN
ために、それぞれの値をチェックし、偽ならばparseFloat
でそれを格納するためにどのような方法があります:
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
の値にします。
ご回答ありがとうございます。最初の質問では、数値に更新するフィールドを指定する必要はなく、各プロパティを参照してチェックを実行する必要があるという点では不明でした。
私はトリックを行うために一緒にこの小さな機能を入れている:
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つのことに注意する:
isNaN
と評価されているため、数字として扱われます。私の場合、parseFloat
を使用すると実際には値はisNaN
に設定されます。再び、見物人のための非常に簡単な修正が、私はその放棄を提供したいと思った。これは私のポジションにいる他の人に役立ちます。
mongodb 2.2以降では、更新では最初のパラメータとしてクエリが使用されるため、doc._idではなく{_id:doc._id}になります。 –
'isNaN(doc.xyz) 'の代わりに文字列が" 123 "または" 3456 "の場合は' typeof doc.xyz ==' string''を使用してください。 – ov1d1u
@ ov1d1u - しかし、元の質問は特にisNaNの使用について尋ねたので、それを選択しました。 – WiredPrairie