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
,所以我选择了它。