2015-01-09 62 views
1

我是mongoDB的新手。我把我的数据作为一个字符串,但我想解析它到一个decimal/ float。 我发现这个代码,但它似乎并没有工作。这是我的代码,它代替了00,*代替“”,并将其解析为一个浮点数。它没有给出任何错误,但是parseFloat(doc).toFixed(2)Mongodb解析字符串为十进制/浮点数

db.behuizingen.find().forEach(function(doc) 
{ 
    var price = doc.Prijs.replace('€', ''); // it may be vary for your other document 
    price = price.replace('-', '00'); 
    price = price.replace('*', ''); 
    doc.Prijs = Number(price); 
    parseFloat(doc).toFixed(2) 

    db.behuizingen.update({_id : doc._id} , doc; 
}) 

在此先感谢。

回答

3

你做错了。首先转换和shell的功能​​没有任何关系。因此,更换该行继续:

doc.Prijs = parseFloat(parseFloat(price).toFixed(2)); 
db.moederborden.update({_id : doc._id} , doc); 

但也要小心。 .update()这个第二个参数在那里的用法是用doc的内容“替换”整个文档。

您可能要做到这一点,而不是:

doc.Prijs = parseFloat(parseFloat(price).toFixed(2)); 
var update = { "$set": {} }; 

Object.keys(doc).each(function(key) { 
    update["$set"][key] = doc[key]; 
}); 

db.moederborden.update({_id : doc._id} , update); 

写入数据库时​​,它使用$set操作,使那些没有在你的doc对象引用的任何现有值不会被覆盖。

+0

感谢您的回答。现在它将'''改为'.'。该类型仍然表示它是一个字符串。我该如何解决? – henktenk

+0

@henktenk对不起,我输入了错误没有我。这意味着被包裹两次。 'parseFloat()'从字符串中发出数字,'.toFixed()'发出一个字符串。所以再次将所有这些都包含在'parseFloat()'中,如图所示。 –

0

我有一个类似的问题,我们没有正确启用十进制序列化,所以我想更新已经在我们的数据库中的文档,以使用Decimal类型而不是String。我用下面的脚本:

db.MyCollection.find({ Price: { $type: "string" } }).forEach(function(doc) { 
    print('Updating price for ' + doc._id); 
    db.MyCollection.update( 
     { _id: doc._id }, 
     { $set : { Price: NumberDecimal(doc.Price) } } 
    ) 
}) 

这仅检索需要的字段类型过滤更新文件,然后使用NumberDecimal将字符串转换成十进制。