2015-01-09 61 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將字符串轉換成十進制。