2015-01-09 3 views
1

mongoDB를 처음 사용했습니다. 내 데이터를 문자열로 가지고 있지만 그것을 decimal/ float으로 파싱하고 싶습니다. 이 코드를 만들었지 만 제대로 작동하지 않는 것 같습니다. 이것은 내 코드이며, 00, *, ""에 대해 바꿉니다. 그리고 float로 파싱합니다. 오류는 발생하지 않지만 parseFloat(doc).toFixed(2).Mongodb 구문 분석 문자열에서 10 진수/부동 소수점

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

잘못 했습니까? 먼저 변환하고 쉘의 Number() 기능은 아무 관계가 없습니다. 그 라인을 계속 바꾸면 계속됩니다.

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

또한주의하십시오. 두 번째 인수가있는 .update()의 사용법은 전체 문서를 doc의 내용으로 "바꿉니다".

대신이 작업을 수행 할 수 있습니다 :

당신의 doc 객체에서 참조되지 않은 기존 값을 덮어 쓰지 않도록 데이터베이스에 기록 할 때의 $set 연산자를 사용
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); 

.

+0

답변 해 주셔서 감사합니다. 이제','을'.'로 변경합니다. 유형은 여전히 ​​문자열이라고 말합니다. 이 문제를 어떻게 해결할 수 있습니까? – henktenk

+0

@henktenk 죄송합니다. 잘못 입력 한 것은 아닙니다. 두 번 감쌌습니다. 'parseFloat()'는 문자열에서 숫자를 내보내고,'.toFixed()'는 문자열을 출력합니다. 그래서 모든 것을'parseFloat()'에 다시 포장하십시오. –

0

올바르게 십진수를 직렬화 할 수없는 비슷한 문제가있어서 String 대신 Decimal 유형을 사용하기 위해 이미 데이터베이스에있는 문서를 업데이트하고 싶습니다.

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를 사용 : 나는 다음과 같은 스크립트를 사용했다.

관련 문제