2012-07-01 9 views
5

Abbiamo un'applicazione che memorizza alcuni valori di configurazione da C/C++ in MongoDB e ha la possibilità di essere riavviato (cioè funziona per un po ', qualcuno interrompe l'applicazione, cambia la configurazione, quindi esegue nuovamente l'app e riprende da dove era stata interrotta). Funziona come un incantesimo per le configurazioni booleane e stringa.Cambiare il tipo di un campo MongoDB in numero intero dalla sua console

Ma poi abbiamo alcuni interi (nella nostra attuale implementazione C/C++ - valori a 32 bit). E quando uso la console MongoDB per modificare quei valori interi, Mongo li memorizza sempre come Number (che è doulble nell'implementazione C/C++). Modificheremo l'app in modo da ottenere valori doppi in attesa di numeri interi, ma mi chiedevo se esiste un modo per forzare Mongo a memorizzare numeri interi dalla sua console JavaScript.

Qualche suggerimento?

+0

Rispondere nuovamente ai valori utilizzando parseFloat() o semplicemente non inserire alcun segno di riconoscimento vocale attorno al valore – Sammaye

+1

In realtà provare parseInt() scusa – Sammaye

risposta

9

Nel "senso della parola" C/C++, gli interi sono not actually guaranteed come valori a 32 bit. Un int deve essere di almeno 16 bit, ma generalmente corrisponde all'architettura della piattaforma (ad esempio 32 o 64 bit).

Come detto da @Jasd, JavaScript ha solo un tipo numerico che è un punto mobile (double in C).

Dalla shell MongoDB dovresti essere in grado di utilizzare le funzioni NumberInt(..) per ottenere un BSON 32-bit integer value o NumberLong(..) per ottenere un numero BSON a 64 bit.

+1

nice catch circa la dimensione int! –

+0

Nota problema https://jira.mongodb.org/browse/SERVER-5424 – nikow

0

La shell di MongoDB è alimentata da un motore JavaScript. E JavaScript non ha alcun tipo per integer. Conosce solo Number, che è un tipo per i numeri in virgola mobile.
Si può provare a utilizzare il tipo MongoDB NumberLong, ma non ha funzionato per me quando ho avuto lo stesso problema una volta.

8

è possibile risolvere i tipi di tutti i valori per un determinato campo sulla console con qualcosa di simile:

db.Statistic.find({kodoId: {$exists: true}}).forEach(function (x) { 
    x.kodoId = NumberInt(x.kodoId); 
    db.Statistic.save(x); 
}); 

Questo sarà solo i documenti di carico che hanno il campo kodoId e convertirli in int e salvare. Si potrebbe fare qualcosa di simile:

db.Statistic.find({kodoId: {$exists: true}}, {kodoId: 1}).forEach(function (x) { 
    db.Statistic.update({ _id: x._id }, 
     {$set: { 
     kodoId: NumberInt(x.kodoId) 
     }}); 
}); 

con un secondo parametro che sarà solo carico il valore kodoId (si spera da un indice). Questo dovrebbe essere molto più veloce in quanto non ha bisogno di caricare e salvare nuovamente l'intero documento - solo quel campo.

+0

Si potrebbe aggiungere un 'try .. catch (err)' al secondo esempio nel caso in cui ci siano alcuni valori che sono già NumberInt dal momento che genererà un errore. –

+0

Ha funzionato come un incantesimo per me. Grazie! –

Problemi correlati