2016-07-19 2 views
0

약간 이상한 상황이 있습니다.몽고는 너무 긴 _id를 가진 객체를 찾을 수 없습니다

나는 명시 적으로 _id를 설정하는 콜렉션 "refs"의 오브젝트를 유지합니다. 그래서 나는 아주 큰 이드를 가진 물건을 가지고있다.

db.refs.find({_id: 9200000000165761625}); // nothing 

그러나 : 내가 찾을 때

db.refs.find().sort({_id: -1}); 
// {_id: 9200000000165761625} 
// ... 

는 그러나 몽고에서 가장 큰 ID를 가진 객체는 아무 것도 반환하지 않습니다 쉘!

db.refs.find({_id: 9200000000165761625}).count(); // return 1 

어떻게 될 수 있습니까?

+0

db.refs.count ({_ id : 9200000000165761625})는 어떨까요 –

+0

트위터 ID를 내 _id로 사용하려고해도 같은 문제가 있습니다. str (tweet.id)을 사용하도록 파이썬 로더 코드를 변경했습니다. –

답변

0

문제점을 재현 할 수 없습니다. 내가 지정한 _id 값을 성공적으로 쿼리 할 수있었습니다. enter image description here

쿼리하는 때 올바른 컬렉션 이름을 전달하고 있는지 확인

+0

참고로 스크린 샷에서 여전히 문제가 분명합니다. JavaScript의 최대 안전한 정수보다 긴 값은 'mongo' 셸에서 안전하게 표현할 수 없습니다. 삽입 한 '_id'는 (수학적으로) 검색하는 값과 일치하지 않지만 둘 다 결국 JavaScript 번호와 같은 표현을 갖게됩니다. – Stennie

0

자바 스크립트를 현재 64 비트 부동 소수점 값으로 모든 값을 나타내는 단일 숫자 유형 Number을 가지고 있습니다. JavaScript의 기본 Number 형식에서 최대 안전 정수 표현은 2 -1 또는 9007199254740991 (상수 Number.MAX_SAFE_INTEGER에서 반환 됨)입니다.

안전 범위를 벗어난 정수 값은 명확하게 표현할 수 없으므로 두 개 이상의 수학 값이 동일한 JavaScript 숫자로 매핑됩니다.

당신은 인접 값으로 mongo 쉘에서이 효과를 볼 수 있습니다

당신 (안전 정수 크기보다 큰) _id 제공 :

> 9200000000165761624 
9200000000165762000 

> 9200000000165761625 
9200000000165762000 

> 9200000000165761626 
9200000000165762000 

그러나, 이러한 드라이버/클라이언트 제한은 기본 구별됩니다 문서 용으로 MongoDB의 BSON format에서 사용되는 데이터 유형. BSON은 64 비트 정수로 최대 값 범위를 나타내는 64 비트 정수 유형을 가지고 있습니다. 최대 값은 2 -1입니다.

_id은 64 비트 정수 범위 내에 있지만 64 비트 정수를 지원하는 드라이버를 사용하여 삽입 또는 업데이트 할 수는 있지만 64 비트 정수를 안전하게 쿼리하거나 조작 할 수는 없습니다. mongo 셸 또는 기타 JavaScript 환경. 예기치 않은 결과를 피하려면 이러한 긴 _id 값에 대해 다른 데이터 유형을 사용하는 것이 좋습니다.