Mongo转换存储为字符串的所有数字字段

时间:2013-02-13 19:59:27

标签: javascript mongodb

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

有没有办法在我的收藏集中浏览每个文档并检查isNaN的每个值,如果为false,则将其存储为parseFloat

2 个答案:

答案 0 :(得分:6)

这样的东西应该来自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) } }
        )
    }
})

循环遍历每个文档,按照您的建议使用isNaN,然后$sets当前文档的parseFloat值。{/ p>

答案 1 :(得分: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. 此功能会激活您的日期值! {j}日期由isNaN评估为false,因此将被视为数字。在我的情况下,使用parseFloat实际上会将值设置为isNaN。对于旁观者来说,这是一个非常简单的解决方案,但我只想提供免责声明。
  3. 希望这可以帮助我的其他人。