现在看起来我已经将我的小数存储为字符串了。这现在是一个问题,因为我需要开始使用聚合框架来执行一些计算。Mongo转换存储为字符串的所有数字字段
有什么办法走路每个文件在我的收藏,并检查各值isNaN
,而如果为假,它parseFloat
现在看起来我已经将我的小数存储为字符串了。这现在是一个问题,因为我需要开始使用聚合框架来执行一些计算。Mongo转换存储为字符串的所有数字字段
有什么办法走路每个文件在我的收藏,并检查各值isNaN
,而如果为假,它parseFloat
事情是这样的存储应该从蒙戈贝壳工作:
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
值。
感谢您的回复。在我最初的问题中,我并不清楚,我不想指定要更新为数字的字段,而是走每个属性并执行检查。
我已经把这个小功能,这样的伎俩:
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
评估为false,因此将被视为数字。在我的情况下,使用parseFloat
实际上将该值设置为isNaN
。再次,旁观者的一个非常简单的修复,但我只是想提供该免责声明。希望这可以帮助其他人在我的位置。
从mongodb 2.2开始,更新将查询作为第一个参数,因此{_id:doc._id}而不是doc._id。 – 2013-10-23 04:09:49
如果你的字符串是“123”或“3456”,你应该使用'typeof doc.xyz =='string''而不是'isNaN(doc.xyz)'。 – ov1d1u 2014-09-26 12:10:03
@ ov1d1u - 原来的问题,但具体询问使用'isNaN',所以我选择了。 – WiredPrairie 2014-09-26 12:15:50