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

Javascript Mongo转换存储为字符串的所有数字字段,javascript,mongodb,Javascript,Mongodb,看起来有一段时间我一直在把小数存储为字符串。这现在是一个问题,因为我需要开始使用聚合框架来执行一些计算 是否有任何方法可以遍历我收集的每个文档并检查isNaN的每个值,如果为false,则使用parseFloat将其存储在mongo shell中,类似的方法应该可以工作: db.yourCollection.find({}).forEach(function(doc) { if(isNaN(doc.xyz)) { print('found string: ' + do

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


是否有任何方法可以遍历我收集的每个文档并检查
isNaN
的每个值,如果为false,则使用
parseFloat

将其存储在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
,然后
$将当前文档的值设置为
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 );
        }
    }
}
有两点需要注意:

  • 这仅检查和转换到第一级属性。它可以很容易地修改到更深,但这是我在这个时候所需要的
  • 此函数将使您的日期值消失isNaN将javascript日期评估为false,因此将被视为数字。在我的例子中,使用
    parseFloat
    实际上会将值设置为
    isNaN
    。同样,对于旁观者来说,这是一个非常简单的修复方法,但我只想提供免责声明

  • 希望这有助于我的其他人。

    从mongodb 2.2开始,更新将查询作为第一个参数,因此{u id:doc.\u id}而不仅仅是doc.\u id.如果字符串是“123”或“3456”,则应该使用
    typeof doc.xyz='string'
    而不是
    isNaN(doc.xyz)
    .@ov1d1u-然而,最初的问题是关于使用
    的具体问题,是NaN
    ,所以我选择了它。