MongoDB вставляет float при попытке вставить целое число

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

Как мне заставить Монго вставить целое число?

Спасибо

мечтатель
источник
какую версию mongodb вы используете?
kamaradclimber
1
обратите внимание, что в моем случае, когда я хотел {$ set: {val: NumberInt (0)}} для некоторого "val", который уже установлен как Long, это не изменило его. Я должен был сначала изменить его на какое-то другое значение, затем изменить его обратно на 0, чтобы NumberInt (0) вступил в силу
kommradHomer
У меня была та же проблема, после осознания того, что я по ошибке изменил int32 на double, возвращение его обратно с помощью NumberInt () не исправило тип, если я сначала не изменил значение.
user1055568

Ответы:

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

Вы также можете использовать NumberLong.

Берни Хакетт
источник
1
но в findOne он говорит NumberLong (0) не как 0
мечтатель
11
По умолчанию оболочка mongo обрабатывает все числа как значения с плавающей точкой. Поэтому нам нужно явно указать, какой тип числа мы хотим использовать, например, NumberInt или NumberLong. docs.mongodb.org/manual/core/shell-types
Яду,
12
У меня есть вопрос. NumberInt предоставляется только в оболочке mongo. Как это сделать на языке JavaScript, таком как node.js?
客 易 客
@Shawyeok вот ответ stackoverflow.com/a/21870772/3815843
GRiMe2D
Важно учитывать, что у инттов есть границы. Если число большое, рассмотрите возможность использования NumberLong
Тим Гивуа
17

Немного более простой синтаксис (по крайней мере в Robomongo) работал для меня:

db.database.save({ Year : NumberInt(2015) });
Сетка Треккор
источник
5

Если тип значения уже double, то обновление значения с помощью команды $ set не может изменить тип значения double на int при использовании функции NumberInt () или NumberLong (). Итак, чтобы изменить тип значения, необходимо обновить всю запись.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Итан. Zhang
источник
$setработал по крайней мере в Mongo 4.2, так что, возможно, это ошибка.
Цербер
-10

Ну, это JavaScript, так что в значении у вас есть число, которое может быть целым числом или числом с плавающей точкой. Но на самом деле нет никакой разницы в JavaScript. Из изучения JavaScript :

Тип данных Number

Числовые типы данных в JavaScript являются числами с плавающей запятой, но они могут иметь или не иметь дробный компонент. Если у них нет десятичной точки или дробного компонента, они рассматриваются как целые числа - целые числа с основанием 10 в диапазоне от –2 53 до 2 53 .

Кристиан Хорсдал
источник
27
На самом деле это не так. Хотя JS не видит разницы, как только вы подключитесь к монго с другого языка (например, Java), вы почувствуете разницу.
Омри Спектор
2
Мое приложение сломалось в разных точках только по одной причине, int сохраняется и возвращается как float. Я подозреваю, что причиной должны быть некоторые ручные вставки, которые я сделал через оболочку mongo, которая использует javascript.
Мелси