现在好像有一段时间我一直把我的小数存储为字符串。现在这是一个问题,因为我需要开始使用聚合框架来执行一些计算。
有没有办法在我的收藏集中浏览每个文档并检查isNaN
的每个值,如果为false,则将其存储为parseFloat
答案 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 );
}
}
}
有两点需要注意:
isNaN
评估为false,因此将被视为数字。在我的情况下,使用parseFloat
实际上会将值设置为isNaN
。对于旁观者来说,这是一个非常简单的解决方案,但我只想提供免责声明。希望这可以帮助我的其他人。