2014-09-20 5 views
8

Ho usato mongoimport per importare alcuni dati csv in mongodb.Come modificare un tipo di mongodb da Double o Integer a String?

Per lo più ha creato correttamente i tipi, ma ci sono alcuni casi in cui sono stati creati Doppie o Interi dove sono richieste le stringhe.

Ho provato diverse tecniche per convertire questi campi in stringhe inutilmente.

Ecco che cosa ho provato:

Questo prodotto un cambiamento indesiderato a un tipo di oggetto (tipo = 3):

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

Risultato si presentava così:

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

questo prodotto nessuna modifica:

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

Ciò ha prodotto nessun cambiamento:

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

Questo prodotto nessun cambiamento:

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

Questo prodotto nessun cambiamento:

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

Questo prodotto un errore: TypeError: Object 0.22 non ha un metodo "toNumber"

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

Questa domanda è stata posta prima. Dai un'occhiata alla risposta per questa ['domanda'] (http://stackoverflow.com/questions/4973095/mongodb-how-to-change-the-type-of-a-field) –

+0

Grazie. Avevo già letto queste risposte a quella domanda ea molte altre. Stranamente, le prime 2 risposte per la domanda che hai menzionato non sembrano funzionare davvero. Come indicato, la risposta più alta ha convertito il tipo in Object (type = 3) anziché in String (type = 2). La seconda risposta più popolare, non ha apportato alcun cambiamento. –

risposta

11

Se si desidera memorizzare i dati convertiti, è necessario il documento update, altrimenti il ​​documento modificato non va dove.

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

quanto riguarda la questione toNumber, non è una funzione build-in. Potresti voler utilizzare parseInt o parseFloat invece:

parseInt("1000"); // output: 1000 
Problemi correlati