2014-09-20 3 views
8

Ich benutzte Mongoimport, um einige CSV-Daten in mongodb zu importieren.Wie ändere ich einen Mongodb-Typ von Double oder Integer in String?

Es hat hauptsächlich Typen korrekt erstellt, aber es gibt einige Instanzen, in denen Double oder Integer erstellt wurden, in denen Strings gewünscht werden.

Ich habe mehrere Techniken ausprobiert, um diese Felder in Zeichenfolgen ohne Erfolg zu konvertieren.

Hier ist, was ich versucht habe:

Dies zu einem Objekttyp eine unerwünschte Änderung erzeugt (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); 
}); 

Ergebnis sah wie folgt aus:

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

Dies erzeugt keine Änderung:

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

Diese keine Änderung produziert:

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

Diese keine Änderung produziert:

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

Diese keine Änderung produziert:

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

dies ein Fehler erzeugt: Typeerror: Object 0,22 hat kein Verfahren 'toNumber'

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

Diese Frage wurde zuvor gestellt. Werfen Sie einen Blick auf die Antwort für diese ['Frage '] (http://stackoverflow.com/questions/4973095/mongodb-how-to-change-the-type-of-a-field) –

+0

Danke. Ich hatte diese Antworten auf diese Frage und einige andere bereits gelesen. Seltsamerweise scheinen die obersten 2 Antworten für die Frage, die Sie erwähnten, nicht wirklich zu funktionieren. Wie angegeben, konvertierte die oberste Antwort den Typ in Object (Typ = 3) anstelle von String (Typ = 2). Die zweitbeliebteste Antwort änderte nichts. –

Antwort

11

Wenn Sie die konvertierten Daten speichern möchten, müssen Sie das Dokument update das Dokument, andernfalls das geänderte Dokument geht an keine wohin.

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

In Bezug auf das toNumber Problem, es ist keine build-in-Funktion. Vielleicht möchten Sie stattdessen parseInt oder parseFloat verwenden:

parseInt("1000"); // output: 1000 
Verwandte Themen