MongoDB wstawia liczbę zmiennoprzecinkową podczas próby wstawienia liczby całkowitej

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

Jak zmusić Mongo do wstawienia liczby całkowitej?

Dziękuję Ci

marzyciel
źródło
jakiej wersji mongodb używasz?
kamaradclimber
1
zwróć uwagę, że w moim przypadku, gdy chciałem {$ set: {val: NumberInt (0)}} przy jakimś „val”, który jest już ustawiony jako Long, nie zmienił tego. Musiałem najpierw zmienić na inną wartość, a następnie z powrotem na 0, aby NumberInt (0)
zadziałało
Miałem ten sam problem, po uświadomieniu sobie, że przez pomyłkę zmieniłem int32 na podwojony, ustawienie go z powrotem za pomocą NumberInt () nie naprawiło tego typu, chyba że najpierw zmieniłem na inną wartość.
user1055568,

Odpowiedzi:

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

Możesz także użyć NumberLong.

Bernie Hackett
źródło
1
ale w findOne mówi NumberLong (0) nie jako 0
marzyciel
11
Domyślnie powłoka mongo traktuje wszystkie liczby jako wartości zmiennoprzecinkowe. Musimy więc wyraźnie określić, jakiego rodzaju liczby chcemy użyć, np. NumberInt lub NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu,
12
Mam pytanie. NumberInt jest dostępny tylko w powłoce mongo, jak to zrobić w języku JavaScript, takim jak node.js?
萧 易 客
@Shawyeok tutaj jest odpowiedź stackoverflow.com/a/21870772/3815843
GRiMe2D
Ważne jest, aby wziąć pod uwagę, że ints mają granice. Jeśli liczba jest duża, rozważ użycie NumberLong
Tim Givois
17

Pracowała dla mnie nieco prostsza składnia (przynajmniej w Robomongo):

db.database.save({ Year : NumberInt(2015) });
Trekkor sieciowy
źródło
5

Jeśli typ wartości jest już podwójny, zaktualizuj wartość za pomocą polecenia $ set, nie można zmienić typu wartości podwójnie na int, gdy używana jest funkcja NumberInt () lub NumberLong (). Aby zmienić typ wartości, należy zaktualizować cały rekord.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Ethan Zhang
źródło
$setdziałał przynajmniej w Mongo 4.2, więc może to był błąd.
Cerberus,
-10

Cóż, to JavaScript, więc to, co masz w „wartości”, jest liczbą, która może być liczbą całkowitą lub liczbą zmiennoprzecinkową. Ale tak naprawdę nie ma różnicy w JavaScript. Od nauki JavaScript :

Typ danych liczbowych

Typy danych liczbowych w JavaScript są liczbami zmiennoprzecinkowymi, ale mogą, ale nie muszą, składać się z ułamka. Jeśli nie mają one miejsca po przecinku lub części ułamkowej, są traktowane jako liczby całkowite - liczby całkowite podstawy-10 w zakresie od –2 53 do 2 53 .

Christian Horsdal
źródło
27
W rzeczywistości to nie jest prawda. Podczas gdy JS nie widzi różnicy, jak tylko połączysz się z mongo z innego języka (np. Java), bardzo poczujesz różnicę.
Omri Spector,
2
Moja aplikacja została podzielona na różne punkty tylko z jednego powodu, int jest zapisywany i zwracany jako zmiennoprzecinkowy. Podejrzewam, że przyczyną muszą być ręczne wstawienia za pomocą powłoki mongo, która używa javascript.
Melsi