MongoDB вставки плавають при спробі вставити ціле число


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, щоб номер Number (1)
набув

У мене була така ж проблема, після усвідомлення я помилково змінив int32 на подвійний, встановивши його назад за допомогою NumberInt (), не виправив тип, якщо я вперше не змінив значення на інше.
user1055568

Відповіді:


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

Ви також можете використовувати NumberLong.


1
але в знаходженні однієї мовиться, що NumberLong (0) не як 0
daydreamer

11
За замовчуванням оболонка монго розглядає всі числа як значення з плаваючою комою. Тому нам потрібно чітко вказати, який тип числа ми хочемо використовувати, наприклад NumberInt або NumberLong. docs.mongodb.org/manual/core/shell-types
Яд

12
У мене є питання. NumberInt надається лише в оболонці mongo, як це зробити в мові JavaScript, як node.js?
萧 易 客

@Shawyeok тут відповідь stackoverflow.com/a/21870772/3815843
GRiMe2D

Важливо враховувати, що в інтах є межі. Якщо число велике, подумайте про використання NumberLong
Тім Гівуа

17

Трохи простіший синтаксис (як мінімум у Робомонго) працював у мене:

db.database.save({ Year : NumberInt(2015) });

5

Якщо тип значення вже подвійний, то оновлення значення за допомогою команди $ set не може змінити тип значення double на int при використанні функції NumberInt () або NumberLong (). Отже, щоб змінити тип значення, він повинен оновити весь запис.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)

$setпрацював принаймні в Монго 4.2, тому, можливо, це була помилка.
Цербер

-10

Ну, це JavaScript, тому те, що ви маєте у "значенні" - це число, яке може бути цілим числом або плавкою. Але насправді різниці в JavaScript немає. From Learning JavaScript :

Тип даних про число

Типи даних про число в JavaScript - це числа з плаваючою комою, але вони можуть мати або не мати дробової складової. Якщо вони не мають десяткової крапки або дробової складової, вони розглядаються як цілі числа - базові-10 цілих чисел у діапазоні від –2 53 до 2 53 .


27
Насправді це неправда. Поки JS не бачить різниці, як тільки ви підключитесь до монго з іншої мови (наприклад, java), ви дуже відчуєте різницю.
Омрі Спектор

2
Моя програма зламалася в різних точках лише з однієї причини, int зберігається і повертається як float. Я підозрюю, що причиною повинні бути ручні вставки, які я робив через оболонку mongo, яка використовує JavaScript.
Мелсі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.