5

しばらくの間、小数を文字列として保存しているようです。いくつかの計算を実行するために集計フレームワークの使用を開始する必要があるため、これは現在問題になっています。

コレクション内の各ドキュメントを調べて、各値をチェックしisNaN、falseの場合は、次のように保存する方法はありますか?parseFloat

4

2 に答える 2

6

このようなものは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値を現在のドキュメントの値にします。

于 2013-02-13T20:45:08.620 に答える
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 の日付はisNaNfalse と評価されるため、数値として扱われます。私の場合、 usingparseFloatは実際に値を に設定しますisNaN。繰り返しますが、傍観者にとっては非常に簡単な修正ですが、その免責事項を提供したかっただけです。

これが私の立場にある他の誰かに役立つことを願っています。

于 2013-02-13T21:03:44.333 に答える