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


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.


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) });

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)

$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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.