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ść.
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?
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)
$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 .
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.
Odpowiedzi:
Możesz także użyć NumberLong.
źródło
Pracowała dla mnie nieco prostsza składnia (przynajmniej w Robomongo):
źródło
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.
źródło
$set
działał przynajmniej w Mongo 4.2, więc może to był błąd.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 :
źródło