정수를 삽입하려고 할 때 MongoDB 삽입 부동


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

Mongo가 정수를 삽입하도록하려면 어떻게합니까?

감사합니다


mongodb의 어떤 버전을 사용하십니까?
— kamaradclimber


1
내 경우에는 이미 Long으로 설정된 일부 "val"에서 {$ set : {val : NumberInt (0)}}을 원할 때 변경되지 않았습니다. NumberInt (0)를 적용하려면 먼저 다른 값으로 변경 한 다음 다시 0으로 변경해야합니다.
— kommradHomer

실수로 int32를 double로 변경했다는 것을 알았을 때 같은 문제가 발생했습니다 .NumberInt ()를 사용하여 다시 설정하면 처음으로 다른 값으로 변경하지 않는 한 유형을 수정하지 못했습니다.
— user1055568

답변:


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

NumberLong을 사용할 수도 있습니다.


1
그러나 findOne에서 그것은 NumberLong (0)이 0이 아니라고 말합니다
— daydreamer

11
mongo 쉘은 기본적으로 모든 숫자를 부동 소수점 값으로 취급합니다. 따라서 NumberInt 또는 NumberLong과 같이 사용할 숫자 유형을 명시 적으로 지정해야합니다. docs.mongodb.org/manual/core/shell-types
— Yadu

12
질문이 있습니다. NumberInt는 mongo 쉘에서만 제공됩니다. node.js와 같은 JavaScript 언어로 어떻게합니까?
— 萧 易 客

@Shawyeok 여기에 답변이 있습니다 stackoverflow.com/a/21870772/3815843
— GRiMe2D

정수에 한계가 있다는 점을 고려하는 것이 중요합니다. 숫자가 큰 경우 NumberLong
— Tim Givois

17

(로보 몬고에서) 약간 더 간단한 구문이 저에게 효과적이었습니다.

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

5

값 유형이 이미 두 배인 경우, $ set 명령으로 값을 업데이트하면 NumberInt () 또는 NumberLong () 함수를 사용할 때 값 유형을 double로 int로 변경할 수 없습니다. 따라서 값 유형을 변경하려면 전체 레코드를 업데이트해야합니다.

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

$set적어도 몽고 4.2에서 일 했으므로 아마도 버그 일 것입니다.
— Cerberus

-10

글쎄, 그것은 JavaScript이므로 'value'에있는 것은 정수 또는 부동 소수점 일 수있는 숫자입니다. 그러나 JavaScript에는 실제로 차이가 없습니다. 에서 학습 자바 스크립트 :

숫자 데이터 유형

JavaScript의 숫자 데이터 형식은 부동 소수점 숫자이지만 소수 구성 요소가 있거나 없을 수 있습니다. 그들이 소수점 또는 분수 구성 요소가 설치되어 있지 않은 경우, 그들은 정수 기반-10의 -2 범위의 정수로 취급하고 53 2에 (53) .


27
사실은 사실이 아닙니다. JS에는 차이가 없지만 다른 언어 (예 : java)에서 mongo에 연결하자마자 차이를 느낄 수 있습니다.
— Omri Spector

2
내 응용 프로그램은 한 가지 이유로 만 다른 점으로 깨졌습니다 .int는 저장되고 float로 반환됩니다. javascript를 사용하는 mongo shell을 통해 수동 삽입 해야하는 원인이 의심됩니다.
— Melsi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.