2013-02-13 92 views
5

现在看起来我已经将我的小数存储为字符串了。这现在是一个问题,因为我需要开始使用聚合框架来执行一些计算。Mongo转换存储为字符串的所有数字字段

有什么办法走路每个文件在我的收藏,并检查各值isNaN,而如果为假,它parseFloat

回答

6

事情是这样的存储应该从蒙戈贝壳工作:

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值。

+1

从mongodb 2.2开始,更新将查询作为第一个参数,因此{_id:doc._id}而不是doc._id。 – 2013-10-23 04:09:49

+0

如果你的字符串是“123”或“3456”,你应该使用'typeof doc.xyz =='string''而不是'isNaN(doc.xyz)'。 – ov1d1u 2014-09-26 12:10:03

+1

@ ov1d1u - 原来的问题,但具体询问使用'isNaN',所以我选择了。 – WiredPrairie 2014-09-26 12:15:50

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,因此将被视为数字。在我的情况下,使用parseFloat实际上将该值设置为isNaN。再次,旁观者的一个非常简单的修复,但我只是想提供该免责声明。

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