5

看起来有一段时间我一直将小数存储为字符串。现在这是一个问题,因为我需要开始使用聚合框架来执行一些计算。

有什么方法可以遍历我的集合中的每个文档并检查每个值isNaN,如果为假,则将其存储为parseFloat

4

2 回答 2

6

Something like this should work from the mongo shell:

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

It loops through each document, uses isNaN as you suggested, then $sets the value to the parseFloat value for the current document.

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

有两点需要注意:

  1. 这只会检查和转换到第一级属性。它可以很容易地修改以更深入,但这就是我此时所需要的。
  2. 这个函数会炸掉你的日期值!!!javascript 日期被评估isNaN为 false,因此将被视为数字。就我而言, usingparseFloat实际上会将值设置为isNaN. 同样,对于旁观者来说,这是一个非常简单的解决方法,但我只是想提供该免责声明。

希望这可以帮助其他人在我的位置。

于 2013-02-13T21:03:44.333 回答