しばらくの間、小数を文字列として保存しているようです。いくつかの計算を実行するために集計フレームワークの使用を開始する必要があるため、これは現在問題になっています。
コレクション内の各ドキュメントを調べて、各値をチェックしisNaN
、falseの場合は、次のように保存する方法はありますか?parseFloat
しばらくの間、小数を文字列として保存しているようです。いくつかの計算を実行するために集計フレームワークの使用を開始する必要があるため、これは現在問題になっています。
コレクション内の各ドキュメントを調べて、各値をチェックしisNaN
、falseの場合は、次のように保存する方法はありますか?parseFloat
このようなものはmongoシェルから動作するはずです:
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
false と評価されるため、数値として扱われます。私の場合、 usingparseFloat
は実際に値を に設定しますisNaN
。繰り返しますが、傍観者にとっては非常に簡単な修正ですが、その免責事項を提供したかっただけです。これが私の立場にある他の誰かに役立つことを願っています。