看起来有一段时间我一直将小数存储为字符串。现在这是一个问题,因为我需要开始使用聚合框架来执行一些计算。
有什么方法可以遍历我的集合中的每个文档并检查每个值isNaN
,如果为假,则将其存储为parseFloat
看起来有一段时间我一直将小数存储为字符串。现在这是一个问题,因为我需要开始使用聚合框架来执行一些计算。
有什么方法可以遍历我的集合中的每个文档并检查每个值isNaN
,如果为假,则将其存储为parseFloat
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.
感谢您的答复。我在最初的问题中不清楚,因为我不想指定要更新为数字的字段,而是遍历每个属性并执行检查。
我已经把这个小功能放在一起来解决这个问题:
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,因此将被视为数字。就我而言, usingparseFloat
实际上会将值设置为isNaN
. 同样,对于旁观者来说,这是一个非常简单的解决方法,但我只是想提供该免责声明。希望这可以帮助其他人在我的位置。