2014-09-20 24 views
8

Użyłem mongoimport do importowania niektórych danych CSV do mongodb.Jak zmienić typ mongody z Double lub Integer na String?

Najczęściej tworzy typy poprawnie, ale istnieje kilka przypadków, w których tworzone były liczby podwójne lub liczby całkowite, w których pożądane są ciągi.

Próbowałem już kilka technik, aby przekonwertować te pola na ciągi bezskutecznie.

Oto co próbowałem:

Ten produkowany niepożądaną zmianę typu Object (typ = 3):

db.temp.find({ 'name' : { $type : 16 } }).forEach(function (x) { 
    x.name = new String(x.name); // convert field to string 
    db.temp.save(x); 
}); 

Wynik wyglądał następująco:

> db.temp.findOne({name: {$type:3}}) 
{ 
    "_id" : ObjectId("541a28ddbf8a2e3ee8439b58"), 
    "name" : { 
     "0" : "0", 
     "1" : ".", 
     "2" : "2", 
     "3" : "2" 
    } 
} 

Ten produkowany bez zmian:

db.temp.find({name: {$exists:true}}).forEach(function(x) { 
    x.name = "" + x.name; 
}); 

ten wytwarza się bez zmian:

db.temp.find({name: {$exists:true}}).forEach(function(x) { 
    x.name = x.name + ""; 
}); 

ten nie powodowały zmiany:

db.temp.find({name: {$exists:true}}).forEach(function(x) { 
    x.name = "" + x.name + ""; 
}); 

ten nie powodowały zmiany:

db.temp.find({name: {$exists:true}}).forEach(function(x) { 
    x.name = x.name.toString(); 
}); 

ten wytwarzany błąd: TypeError: obiekt 0,22 nie ma metody "toNumber"

db.temp.find({name: {$exists:true}}).forEach(function(x) { 
    x.name = x.name.toNumber().toString(); 
}); 
+0

To pytanie zostało zadane wcześniej. Spójrz na odpowiedź na to ['pytanie'] (http://stackoverflow.com/questions/4973095/mongodb-how-to-change-the-type-of-a-field) –

+0

Dzięki. Przeczytałem już odpowiedzi na to pytanie i kilka innych. O dziwo, dwie pierwsze odpowiedzi na pytanie, o którym wspomniałeś, wydają się nie działać. Jak wskazano, odpowiedź z góry przekonwertowała typ na Object (type = 3) zamiast na String (type = 2). Druga najpopularniejsza odpowiedź nie zmieniła się wcale. –

Odpowiedz

11

Jeśli chcesz przechowywać przekonwertowane dane, musisz update dokumentu, w przeciwnym razie zmieniony dokument idzie do nie gdzie.

db.temp.find({name: {$exists:true}}).forEach(function(x) { 
    db.temp.update({_id: x._id}, {$set: {name: x.name.toString()}}); 
}); 

Jeśli chodzi o numer toNumber, nie jest to funkcja wbudowana. Możesz użyć parseInt lub parseFloat zamiast:

parseInt("1000"); // output: 1000 
Powiązane problemy