MongoDB fügt float ein, wenn versucht wird, eine Ganzzahl einzufügen

209
   > db.data.update({'name': 'zero'}, {'$set': {'value': 0}}) 
   > db.data.findOne({'name': 'zero})
    {'name': 'zero', 'value': 0.0}  

Wie bringe ich Mongo dazu, eine ganze Zahl einzufügen?

Danke dir

Tagträumer
quelle
Welche Version von Mongodb benutzt du?
Kamaradclimber
1
Beachten Sie, dass in meinem Fall, als ich {$ set: {val: NumberInt (0)}} bei einem "val" setzen wollte, der bereits als Long festgelegt ist, dies nicht geändert wurde. Ich musste es zuerst auf einen anderen Wert ändern, dann wieder auf 0, damit NumberInt (0) wirksam wurde
kommradHomer
Ich hatte das gleiche Problem, nachdem mir klar wurde, dass ich einen int32 fälschlicherweise in double geändert hatte. Durch Zurücksetzen mit NumberInt () wurde der Typ nur behoben, wenn ich ihn zuerst auf einen anderen Wert geändert hatte.
user1055568

Antworten:

328
db.data.update({'name': 'zero'}, {'$set': {'value': NumberInt(0)}})

Sie können auch NumberLong verwenden.

Bernie Hackett
quelle
1
aber in findOne steht NumberLong (0) nicht als 0
Tagträumer
11
Standardmäßig behandelt die Mongo-Shell alle Zahlen als Gleitkommawerte. Wir müssen also explizit angeben, welche Art von Nummer wir verwenden möchten, z. B. NumberInt oder NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu
12
Ich habe eine Frage. Das NumberInt wird nur in der Mongo-Shell bereitgestellt. Wie geht das in einer JavaScript-Sprache wie node.js?
易 客
@ Shawyeok hier ist eine Antwort stackoverflow.com/a/21870772/3815843
GRiMe2D
Es ist wichtig zu berücksichtigen, dass Ints Grenzen haben. Wenn die Zahl groß ist, sollten Sie NumberLong
Tim Givois
17

Eine etwas einfachere Syntax (zumindest in Robomongo) hat bei mir funktioniert:

db.database.save({ Year : NumberInt(2015) });
Gitter Trekkor
quelle
5

Wenn der Werttyp bereits doppelt ist, kann die Aktualisierung des Werts mit dem Befehl $ set den Werttyp double nicht in int ändern, wenn die Funktionen NumberInt () oder NumberLong () verwendet werden. Um den Werttyp zu ändern, muss der gesamte Datensatz aktualisiert werden.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Ethan. Zhang
quelle
$setfunktionierte zumindest in Mongo 4.2, also war dies vielleicht ein Fehler.
Cerberus
-10

Nun, es ist JavaScript. Was Sie also in 'value' haben, ist eine Zahl, die eine ganze Zahl oder ein Gleitkomma sein kann. Aber es gibt keinen wirklichen Unterschied in JavaScript. Vom Erlernen von JavaScript :

Der Nummer-Datentyp

Zahlendatentypen in JavaScript sind Gleitkommazahlen, können jedoch eine Bruchkomponente enthalten oder nicht. Wenn sie keinen Dezimalpunkt oder keine Bruchkomponente haben, werden sie als Ganzzahlen behandelt - Basis-10-Ganzzahlen in einem Bereich von –2 53 bis 2 53 .

Christian Horsdal
quelle
27
Eigentlich stimmt das nicht. Während JS keinen Unterschied sieht, werden Sie den Unterschied sehr spüren, sobald Sie sich aus einer anderen Sprache (z. B. Java) mit Mongo verbinden.
Omri Spector
2
Meine Anwendung ist nur aus einem Grund an verschiedenen Stellen fehlerhaft. Int wird gespeichert und als float zurückgegeben. Ich vermute, die Ursache müssen einige manuelle Einfügungen sein, die ich über die Mongo-Shell gemacht habe, die Javascript verwendet.
Melsi