2012-07-01 17 views
5

Wir haben eine Anwendung, die einige Konfigurationswerte von C/C++ in MongoDB speichert und hat die Fähigkeit, neu gestartet werden (dh es läuft für eine Weile, jemand unterbricht die Anwendung, Ändert die Konfiguration, führt die App erneut aus und nimmt dort auf, wo sie aufgehört hat. Dies funktioniert wie ein Charme für Boolesche und String-Konfigurationen.von seiner Konsole auf ganzzahlige

Aber dann haben wir einige Integer (in unserer aktuellen C/C++ - Implementierung - 32 Bit Werte). Und wenn ich die MongoDB-Konsole verwende, um diese Integer-Werte zu ändern, speichert Mongo sie immer als Nummer zurück (was in der C/C++ - Implementierung möglich ist). Wir werden die App so ändern, dass sie doppelte Werte annimmt, wo ganze Zahlen erwartet werden, aber ich frage mich, ob es eine Möglichkeit gibt, Mongo dazu zu zwingen, ganze Zahlen von seiner JavaScript-Konsole aus zu speichern.

Irgendwelche Vorschläge?

+0

Speichern Sie die Werte mit parseFloat() oder setzen Sie einfach keine Sprachmarkierungen um den Wert – Sammaye

+1

Eigentlich versuchen Sie parseInt() Sorry – Sammaye

Antwort

9

In der C/C++ "Sinn des Wortes" sind ints not actually guaranteed 32-Bit-Werte zu sein. Ein int muss mindestens 16-Bit sein, passt aber generell zur Plattformarchitektur (z. B. 32 oder 64bit).

Wie von @Jasd erwähnt, hat JavaScript nur einen numerischen Typ, der ein Fließkommawert ist (double in C).

Von der MongoDB-Shell sollten Sie die Funktionen NumberInt(..) verwenden können, um eine BSON 32-bit integer value oder zu erhalten, um eine BSON 64-Bit-Ganzzahl zu erhalten.

+1

schönen Fang über die int-Größe! –

+0

Hinweis Problem https://jira.mongodb.org/browse/SERVER-5424 – nikow

0

Die Shell von MongoDB wird von einer JavaScript-Engine unterstützt. Und JavaScript hat keinen Typ für integer. Es kennt nur Number, was ein Typ für Fließkommazahlen ist.
Sie können versuchen, die MongoDB-Typ NumberLong verwenden, aber es hat nicht funktioniert für mich, wenn ich einmal das gleiche Problem hatte.

8

Sie können die Typen aller Werte für einen bestimmten Bereich auf der Konsole mit so etwas wie beheben:

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

Dies wird nur Dokumente Last, die das kodoId Feld haben und wandeln sie in int und erneut speichern.

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

mit einem zweiten param das wird nur Belastung des kodoId Wert (hoffentlich aus einem Index): Sie könnte so etwas wie zu tun. Dies sollte viel schneller sein, da das gesamte Dokument nicht geladen und erneut gespeichert werden muss - nur dieses eine Feld.

+0

Sie könnten ein "try .. catch (err)" um das zweite Beispiel hinzufügen, falls es einige Werte gibt, die bereits NumberInt sind wird einen Fehler auslösen. –

+0

Arbeitete wie ein Zauber für mich. Vielen Dank! –

Verwandte Themen